├── .editorconfig ├── .gitignore ├── .jshintignore ├── .jshintrc ├── CHANGELOG.md ├── LICENSE ├── README.md ├── bower.json ├── dist ├── dominus.js └── dominus.min.js ├── package.json ├── resources └── dominus.png └── src ├── Dominus.ctor.js ├── Dominus.prototype.js ├── apply.js ├── cast.js ├── classes.js ├── custom.js ├── dom.js ├── dominus.js ├── flatten.js ├── null.js ├── public.js ├── test.js └── text.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.jshintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "curly": true, 3 | "eqeqeq": true, 4 | "newcap": true, 5 | "noarg": true, 6 | "noempty": true, 7 | "nonew": true, 8 | "sub": true, 9 | "validthis": true, 10 | "undef": true, 11 | "trailing": true, 12 | "boss": true, 13 | "eqnull": true, 14 | "strict": true, 15 | "immed": true, 16 | "expr": true, 17 | "latedef": "nofunc", 18 | "quotmark": "single", 19 | "indent": 2, 20 | "node": true, 21 | "browser": true 22 | } 23 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # v6.0.0 Ampersbutt 2 | 3 | - `.but` and `.and` now return copies rather than modifying the original object 4 | 5 | # v5.0.6 Cross Breed 6 | 7 | - Updated `crossvent` to `1.5.4` 8 | - Updated `sektor` to `1.1.4` 9 | 10 | # v5.0.3 Cross Breed 11 | 12 | - Updated `sektor` to `1.1.3` 13 | 14 | # v5.0.2 Cross Breed 15 | 16 | - Updated `crossvent` to `1.5.0` 17 | 18 | # v5.0.0 Hide and Seek 19 | 20 | - Removed `.show` and `.hide` methods 21 | 22 | # v4.0.0 Table of Contents 23 | 24 | - Changed `$('div').i(index)` so that if the index is out of bounds the returned Dominus collection is empty rather than have an `undefined` element in it 25 | 26 | # v3.3.0 North Pole 27 | 28 | - Added `.once` method to bind disposable event listeners 29 | 30 | # v.3.2.4 Cross Polinize 31 | 32 | - Updated `crossvent` to `1.3.1` 33 | 34 | # v3.2.3 Interdependant Polinization 35 | 36 | - Extracted `./events` into its own module, `crossvent` 37 | 38 | # v3.2.1 Proper Attribution 39 | 40 | - Fixed a bug where calling `.attr(name, null)` wouldn't remove the `name` attribute from DOM elements 41 | 42 | # v3.2.0 Event Emission 43 | 44 | - Added `.emit` method to fabricate and raise DOM events 45 | 46 | # v3.1.0 Sanity Check 47 | 48 | - Fixed behavior of `Array.prototype.slice` on Dominus arrays 49 | - Introduced ability to interact with `Window` object in `$(window)` 50 | - The dynamic versions of `.show` and `.hide` now receive an element as a parameter 51 | - Fixed a bug where DOM manipulation events would throw native browser errors 52 | 53 | # v3.0.1 Custom Events 54 | 55 | - Introduced custom events 56 | 57 | # v2.5.2 Zen Focus 58 | 59 | - Added `.focus` method on Dominus objects 60 | 61 | # v2.5.1 Attribute Master 62 | 63 | - Allows you to use `.attr(attributes)` with an object map and many attributes 64 | 65 | # v2.4.4 Brothers and Sisters 66 | 67 | - Introduced `.css(prop, value)` method that also allows `.css({ prop: value })` 68 | - Fixed issues with `prev` and `next` where they would've incorrectly return an empty set 69 | 70 | # v2.3.7 Set Interpeter 71 | 72 | - Introduced ability to pass classes as a single string to `.setClass()` 73 | 74 | # v2.3.5 Fat Trimmer 75 | 76 | - Removed dependency on `lodash.find` 77 | 78 | # v2.3.4 Haystack 79 | 80 | - Added `.i(index)` method 81 | 82 | # v2.3.4 Parallel Processing 83 | 84 | - Override `.map` and `.filter` so that they always return a Dominus array 85 | 86 | # v2.3.0 Energy Flux 87 | 88 | - Fixed a bug where mapping and filtering resulted in Dominus arrays being demoted to regular arrays in mobile browsers 89 | 90 | # v2.2.2 Feet Flight 91 | 92 | - Fix issue where removing events failed in old browsers 93 | 94 | # v2.2.1 Cupboard 95 | 96 | - Bumped `poser` to `1.2.0` 97 | 98 | # v2.1.3 Switchboard 99 | 100 | - Use Node implementation of `poser` 101 | 102 | # v2.1.1 Campus Lantern 103 | 104 | - Bumped `poser` to `1.1.5` 105 | 106 | # v2.1.0 Keen Listener 107 | 108 | - Delegated events now match the event target as well as any parents that are also children of the delegate root 109 | 110 | # v2.0.11 Relatives 111 | 112 | - Improved `.children` and `.parents`, now able to filter by other collections or DOM elements 113 | 114 | # v2.0.10 Class Hierarchy 115 | 116 | - Fixed a bug where `.addClass` would replace the existing `className` values with the newer ones 117 | 118 | # v2.0.9 Show and Tell 119 | 120 | - Included `.hide` and `.show` methods with a rich API 121 | 122 | # v2.0.8 Questionable Tactics 123 | 124 | - Fixed a bug where `.and`, `.but` API methods weren't chaining 125 | 126 | # v2.0.7 Parental Advise 127 | 128 | - Replaced internal instances of `.parentNode` with `.parentElement` to avoid hitting the `#document` node 129 | 130 | # v2.0.6 Context King 131 | 132 | - You can now pass a context by using a selector, a Dominus object, or a DOM element 133 | 134 | # v2.0.5 Bumpy Road 135 | 136 | - Bumped `sektor` to 1.1.1, see [its changelog][1] for fixes 137 | - Improved internal build process, automated footprint comparison 138 | 139 | # v2.0.0 Mortal Kombat 140 | 141 | - Dropped `Sizzle` in favor of `sektor`, which is much smaller 142 | 143 | # v1.6.0 Beat the Bush 144 | 145 | - Introduced `.prev`, `.next`, `.parent`, `.parents`, and `.children` methods 146 | - Introduced `.and` and `.but` API methods 147 | - Fixed an issue where you could potentially get duplicate nodes in a Dominus collection 148 | 149 | # v1.5.0 Venture Beat 150 | 151 | - Introduced event delegation 152 | - Introduced event removal 153 | - Named releases! 154 | 155 | # v1.4.0 Right Round 156 | 157 | - Implemented `.addClass`, `.removeClass`, `.setClass`, and `.hasClass` methods 158 | - Introduced ability to create elements using the `$('
')` API 159 | - Added `.remove` method to remove elements from the DOM 160 | - Included DOM manipulation methods `.append`, `.appendTo`, `.prepend`, `.prependTo`, `.after`, `.afterOf`, `.before`, and `.beforeOf`. 161 | - Added `.clone` method 162 | 163 | # v1.3.2 `throw up;` 164 | 165 | - Fixed an issue where `.findOne` would throw. 166 | 167 | # v1.3.1 Box Office 168 | 169 | - Fixed an issue where inputs would be assumed to be checkboxes 170 | 171 | # v1.3.0 Where Is Wally? 172 | 173 | - Added `.where` instance method 174 | - Added `.is` instance method 175 | - Fixed issues when passing in an array to `$()` 176 | - Resolved issues when using the `.attr` getter 177 | 178 | # v1.2.0 _cough_ IE _cough_ 179 | 180 | - Events now have cross-browser support 181 | - Introduced `.attr` method 182 | - `.text` now sets or gets the value text found on check elements if asked directly 183 | - `.value` now sets or gets the boolean checked property for check elements 184 | 185 | # v1.1.5 Bounty Hunter 186 | 187 | - Reverted `v1.1.4` 188 | 189 | # v1.1.4 Bouncy Castle 190 | 191 | - Added `debounce` option to `.on` 192 | 193 | # v1.1.0 All The Small Things 194 | 195 | - Introduced `.text`, and `.value` 196 | - Improved `.on` to support multi-event binding 197 | 198 | # v1.0.0 IPO 199 | 200 | - Initial Public Release 201 | 202 | [1]: https://github.com/bevacqua/sektor/blob/master/CHANGELOG.md#111-short-circuit 203 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright © 2014 Nicolas Bevacqua 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![dominus.png][5] 2 | 3 | > Lean DOM Manipulation 4 | 5 | This isn't a drop-in replacement for jQuery, but rather a different implementation. Dominus is **jQuery minus the cruft**, with a footprint of **~4kB** minified and gzipped, vs the **~33kB** in jQuery. Dominus uses [`sektor`][1] as its selector engine of choice, which is a drop-in replacement for [Sizzle][4], but tens of times smaller in exchange for a more limited feature-set. 6 | 7 | Just like with jQuery, Dominus exposes a rich API that's chainable to the best of its ability. The biggest difference with jQuery at this level is that the `Dominus` wrapper is a real array. These arrays have been modified to include a few other properties in their prototype, but they don't change the native DOM array. [See `poser` for more details on that one.][3] All of this means you can `.map`, `.forEach`, `.filter`, and all of that good stuff that you're used to when dealing with JavaScript collections, and at the same time you get some extra methods just like with jQuery. 8 | 9 | # Install 10 | 11 | Using Bower 12 | 13 | ```shell 14 | bower install -S dominus 15 | ``` 16 | 17 | Using `npm` 18 | 19 | ```shell 20 | npm install -S dominus 21 | ``` 22 | 23 | # API 24 | 25 | The API in Dominus begins with the methods listed below, which allow you to grab an object instance. 26 | 27 | ## Static Methods 28 | 29 | These are the static methods provided by Dominus. Consider these _the entry point_, just like the methods exposed by jQuery on `$`. 30 | 31 | ### `dominus()` 32 | 33 | Returns an empty `Dominus` collection. 34 | 35 | ### `dominus(HTMLElement)` 36 | 37 | Wraps the [`HTMLElement`][2] object in a `Dominus` collection. 38 | 39 | ### `dominus(Dominus)` 40 | 41 | Returns the `Dominus` collection, as-is. 42 | 43 | ### `dominus(Array)` 44 | 45 | Returns a `Dominus` collection with the [`HTMLElement`][2] objects found in the provided array. 46 | 47 | ### `dominus('<{tag-name}>')` 48 | 49 | Returns a `Dominus` collection after creating an element of the provided tag type name. 50 | 51 | ### `dominus(selector, context?)` 52 | 53 | See `dominus.find` below. 54 | 55 | ### `dominus.find(selector, context?)` 56 | 57 | Queries the DOM for the provided selector, using [`sektor`][1]. Returns a `Dominus` collection with [`HTMLElement`][2] objects. If `context` is provided then the search is restricted to children of `context`. The `context` can be either a DOM element, a selector string, or a Dominus object (the first DOM element in the group is used). 58 | 59 | ### `dominus.findOne(selector, context?)` 60 | 61 | Queries the DOM for the provided selector, using [`sektor`][1]. Returns the first matching [`HTMLElement`][2] object, if any. If `context` is provided then the search is restricted to children of `context`. The `context` can be either a DOM element, a selector string, or a Dominus object (the first DOM element in the group is used). 62 | 63 | ### `dominus.custom(name, type, filter)` 64 | 65 | See [Custom Event Filters](#custom-event-filters) below. 66 | 67 | ## Instance Methods 68 | 69 | Once you've gotten yourself a `Dominus` collection, there's a few more methods you'll get access to. I'll denote array instances as `a`, where possible. 70 | 71 | _First off, there's the selection methods._ 72 | 73 | ## Navigation API 74 | 75 | These methods let you search the DOM for the nodes that you want to manipulate. 76 | 77 | ### `a.prev(selector?)` 78 | 79 | Returns the previous sibling, optionally filtered by a `selector`. 80 | 81 | ### `a.next(selector?)` 82 | 83 | Returns the next sibling, optionally filtered by a `selector`. 84 | 85 | ### `a.parent(selector?)` 86 | 87 | Returns the first parent element, optionally filtered by a `selector`. 88 | 89 | ### `a.parents(value?)` 90 | 91 | Returns all parent elements, optionally filtered by another Dominus collection, a DOM element, or a selector. 92 | 93 | ### `a.children(value?)` 94 | 95 | Like `.find`, but only one level deep. Optionally filtered by another Dominus collection, a DOM element, or a selector. 96 | 97 | ### `a.find(selector)` 98 | 99 | Queries the DOM for children of the elements in the array, using the provided selector. Returns a single `Dominus` collection containing all of the results. 100 | 101 | ### `a.findOne(selector)` 102 | 103 | Queries the DOM for children of the elements in the array, using the provided selector. Returns the first matching [`HTMLElement`][2] object, if any. 104 | 105 | ### `a.where(selector)` 106 | 107 | Returns a subset of the elements in the array that match the provided selector. 108 | 109 | ### `a.is(selector)` 110 | 111 | Returns whether at least one of the elements in the array match the provided selector. 112 | 113 | _Then there's also the attribute manipulation API._ 114 | 115 | ## Attribute Methods 116 | 117 | These methods let you modify DOM element attributes or properties. 118 | 119 | ### `a.html(value?)` 120 | 121 | If a `value` is provided then every element in the `Dominus` collection gets assigned that HTML `value`, then `a` is returned for chaining. If you don't provide a `value`, you get the HTML contents of the first node in the `Dominus` collection back. 122 | 123 | ### `a.text(value?)` 124 | 125 | If a `value` is provided then every element in the `Dominus` collection gets assigned that plain text `value`, then `a` is returned for chaining. If you don't provide a `value`, you get the plain text contents of the first node in the `Dominus` collection back. In the case of elements that can be `checked`, the native `value` property is used instead. 126 | 127 | ### `a.value(value?)` 128 | 129 | If a `value` is provided then every element in the `Dominus` collection gets assigned that input `value`, then `a` is returned for chaining. If you don't provide a `value`, you get the input value of the first node in the `Dominus` collection back. In the case of elements that can be `checked`, the native `checked` property is used instead. 130 | 131 | ### `a.attr(name)` 132 | 133 | The `name` attribute's value is returned, for the first element in the collection. 134 | 135 | ### `a.attr(name, value)` 136 | 137 | Every element in the collection gets assigned `value` to the attribute property `name`. Passing `null` or `undefined` as the `value` will remove the attribute from the DOM element entirely. 138 | 139 | ### `a.attr(attributes)` 140 | 141 | The `attributes` map is used to assign every property-value pair to the attributes in every element. 142 | 143 | ### `a.addClass(value)` 144 | 145 | Adds `value` to every element in the collection. `value` can either be a space-separated class list or an array. 146 | 147 | ### `a.removeClass(value)` 148 | 149 | Removes `value` from every element in the collection. `value` can either be a space-separated class list or an array. 150 | 151 | ### `a.setClass(value)` 152 | 153 | Sets `value` for every element in the collection. `value` can either be a space-separated class list or an array. 154 | 155 | ### `a.hasClass(value)` 156 | 157 | Returns `true` if at least one of the elements in the collection matches every class in `value`. `value` can either be a space-separated class list or an array. 158 | 159 | ### `a.css(prop)` 160 | 161 | Gets the CSS property value for `prop` from the first element in the set of matched elements. `camelCase` gets converted into `hyphen-case`. 162 | 163 | ### `a.css(prop, value)` 164 | 165 | Sets the CSS property value for `prop` to `value` for every element in the set of matched elements. `camelCase` gets converted into `hyphen-case`. 166 | 167 | ### `a.css(props)` 168 | 169 | Sets the CSS property values for every element in the set of matched elements using the provided `props` map. `camelCase` gets converted into `hyphen-case`. 170 | 171 | Example: 172 | 173 | ```js 174 | dominus('body').css({ color: 'blue', width: 600 }); 175 | ``` 176 | 177 | _You can physically alter the DOM, using the methods listed in the next category._ 178 | 179 | ## DOM Manipulation 180 | 181 | ### `a.on(type, filter?, fn)` 182 | 183 | Attaches the event handler `fn` for events of type `type` on every element in the `Dominus` collection. You can also pass in a list of event types, such as `click dragstart`, and both events get the event listener attached to them. 184 | 185 | The `filter?` argument is optional, and you can use it to provide a selector that will filter inputs. This is known as event delegation. The example below will bind a single event listener that will fire only when child nodes matching the `.remove` selector are clicked. 186 | 187 | ```js 188 | dominus('.products').on('click', '.remove', removeProduct); 189 | ``` 190 | 191 | ### `a.once(type, filter?, fn)` 192 | 193 | Meant for when you want to listen for an event only once. This method is identical to `a.on(type, filter?, fn)`, except the event listener will be removed right before your `fn` callback is executed. 194 | 195 | ### `a.off(type, filter?, fn)` 196 | 197 | Turns off event listeners matching the event `type`, the `filter` selector _(if any)_, and the event handler. 198 | 199 | ### `a.emit(type)` 200 | 201 | Fabricates a synthetic event of type `type` and dispatches it for each element in the collection. Note that these events are even accessible outside of Dominus. 202 | 203 | ```js 204 | var el = document.getElementById('dollars'); 205 | el.addEventListener('dollarsigns', function () { 206 | alert('$$$'); 207 | }); 208 | $(el).emit('dollarsigns'); 209 | ``` 210 | 211 | ### Custom Event Filters 212 | 213 | Dominus allows you to create custom sub-events. For example, you could have a custom click sub-event that only triggers on left clicks; or a custom key press event that only triggers when certain keys are pressed. 214 | 215 | Dominus ships with the following custom events. 216 | 217 | Event | Description 218 | ---------------|----------------------------------------------------------- 219 | `'left-click'` | Only triggers when a left click happens while no meta keys are pressed (Command, Control) 220 | 221 | You can register your own custom events using `dominus.custom`. 222 | 223 | #### `dominus.custom(name, type, filter)` 224 | 225 | Register a custom event named `name`. This event will trigger whenever a `type` event triggers, but only if `filter(e)` returns `true`. 226 | 227 | As an illustrative example, here's how the `left-click` custom event is registered. 228 | 229 | ```js 230 | dominus.custom('left-click', 'click', function (e) { 231 | return e.which === 1 && !e.metaKey && !e.ctrlKey; 232 | }); 233 | ``` 234 | 235 | Adding or removing event listeners to custom event filters is no different from adding or removing regular event listeners. 236 | 237 | ```js 238 | $('#home').on('left-click', navigateHome); 239 | ``` 240 | 241 | ### `a.focus()` 242 | 243 | Invokes [`HTMLElement.focus()`][6] on the first DOM element in the collection. 244 | 245 | ### `a.clone()` 246 | 247 | Returns a deep clone of the DOM elements in the collection. 248 | 249 | ### `a.remove()` 250 | 251 | Removes the selected elements from the DOM. 252 | 253 | ### `a.append(elem)` 254 | 255 | Inserts the provided `elem` as the last child of each element in the collection. 256 | 257 | ### `a.appendTo(elem)` 258 | 259 | Inserts every element in the collection as the last children of the provided `elem`. 260 | 261 | ### `a.prepend(elem)` 262 | 263 | Inserts the provided `elem` as the first child of each element in the collection. 264 | 265 | ### `a.prependTo(elem)` 266 | 267 | Inserts every element in the collection as the first children of the provided `elem`. 268 | 269 | ### `a.before(elem)` 270 | 271 | Inserts the provided `elem` as the previous sibling of each element in the collection. 272 | 273 | ### `a.after(elem)` 274 | 275 | Inserts the provided `elem` as the next sibling of each element in the collection. 276 | 277 | ### `a.beforeOf(elem)` 278 | 279 | Inserts every element in the collection as the previous siblings of the provided `elem`. 280 | 281 | ### `a.afterOf(elem)` 282 | 283 | Inserts every element in the collection as the next siblings of the provided `elem`. 284 | 285 | The methods listed below affect the collection itself 286 | 287 | ## Dominus Collection Methods 288 | 289 | Besides the fact that `Dominus` is an [out-of-context `Array` object][3], meaning you can do all the fun functional programming you're used to, there's a few more methods to manipulate the collection itself. 290 | 291 | ### `a.and(...)` 292 | 293 | Returns a copy of `a`, adding the result of calling [`dominus()`](#dominus-1) with the arguments you provided to the current collection. 294 | 295 | This means that you can use `.and` with selectors, a DOM element, an array of DOM elements, or another Dominus collection. 296 | 297 | ### `a.but(...)` 298 | 299 | Returns a copy of `a`, removing the result of calling [`dominus()`](#dominus-1) with the arguments you provided from the current collection. 300 | 301 | This means that you can use `.but` with selectors, a DOM element, an array of DOM elements, or another Dominus collection. 302 | 303 | ### `a.i(index)` 304 | 305 | Returns the element at index `index`, wrapped in a Dominus object. If the `index` is out of bounds then an empty Dominus collection will be returned. 306 | 307 | # License 308 | 309 | MIT 310 | 311 | [1]: https://github.com/bevacqua/sektor 312 | [2]: https://developer.mozilla.org/en/docs/Web/API/HTMLElement 313 | [3]: https://github.com/bevacqua/poser 314 | [4]: https://github.com/jquery/sizzle 315 | [5]: https://raw.githubusercontent.com/bevacqua/dominus/master/resources/dominus.png 316 | [6]: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.focus 317 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dominus", 3 | "description": "Lean DOM Manipulation", 4 | "version": "6.0.0", 5 | "homepage": "https://github.com/bevacqua/dominus", 6 | "author": { 7 | "name": "Nicolas Bevacqua", 8 | "email": "ng@bevacqua.io", 9 | "url": "http://bevacqua.io" 10 | }, 11 | "license": "MIT", 12 | "repository": { 13 | "type": "git", 14 | "url": "git://github.com/bevacqua/dominus.git" 15 | }, 16 | "main": "dist/dominus.js", 17 | "ignore": [ 18 | ".*", 19 | "package.json", 20 | "node_modules", 21 | "src", 22 | "test", 23 | "gulpfile.js" 24 | ], 25 | "dependencies": {} 26 | } 27 | -------------------------------------------------------------------------------- /dist/dominus.js: -------------------------------------------------------------------------------- 1 | (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.dominus = f()}})(function(){var define,module,exports;return (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= 9 150 | 'function' === typeof document.createEvent ? function CustomEvent (type, params) { 151 | var e = document.createEvent('CustomEvent'); 152 | if (params) { 153 | e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail); 154 | } else { 155 | e.initCustomEvent(type, false, false, void 0); 156 | } 157 | return e; 158 | } : 159 | 160 | // IE <= 8 161 | function CustomEvent (type, params) { 162 | var e = document.createEventObject(); 163 | e.type = type; 164 | if (params) { 165 | e.bubbles = Boolean(params.bubbles); 166 | e.cancelable = Boolean(params.cancelable); 167 | e.detail = params.detail; 168 | } else { 169 | e.bubbles = false; 170 | e.cancelable = false; 171 | e.detail = void 0; 172 | } 173 | return e; 174 | } 175 | 176 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 177 | 178 | },{}],4:[function(require,module,exports){ 179 | var poser = require('./src/node'); 180 | 181 | module.exports = poser; 182 | 183 | ['Array', 'Function', 'Object', 'Date', 'String'].forEach(pose); 184 | 185 | function pose (type) { 186 | poser[type] = function poseComputedType () { return poser(type); }; 187 | } 188 | 189 | },{"./src/node":5}],5:[function(require,module,exports){ 190 | (function (global){ 191 | 'use strict'; 192 | 193 | var d = global.document; 194 | 195 | function poser (type) { 196 | var iframe = d.createElement('iframe'); 197 | 198 | iframe.style.display = 'none'; 199 | d.body.appendChild(iframe); 200 | 201 | return map(type, iframe.contentWindow); 202 | } 203 | 204 | function map (type, source) { // forward polyfills to the stolen reference! 205 | var original = window[type].prototype; 206 | var value = source[type]; 207 | var prop; 208 | 209 | for (prop in original) { 210 | value.prototype[prop] = original[prop]; 211 | } 212 | 213 | return value; 214 | } 215 | 216 | module.exports = poser; 217 | 218 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 219 | 220 | },{}],6:[function(require,module,exports){ 221 | (function (global){ 222 | 'use strict'; 223 | 224 | var expando = 'sektor-' + Date.now(); 225 | var rsiblings = /[+~]/; 226 | var document = global.document; 227 | var del = document.documentElement || {}; 228 | var match = ( 229 | del.matches || 230 | del.webkitMatchesSelector || 231 | del.mozMatchesSelector || 232 | del.oMatchesSelector || 233 | del.msMatchesSelector || 234 | never 235 | ); 236 | 237 | module.exports = sektor; 238 | 239 | sektor.matches = matches; 240 | sektor.matchesSelector = matchesSelector; 241 | 242 | function qsa (selector, context) { 243 | var existed, id, prefix, prefixed, adapter, hack = context !== document; 244 | if (hack) { // id hack for context-rooted queries 245 | existed = context.getAttribute('id'); 246 | id = existed || expando; 247 | prefix = '#' + id + ' '; 248 | prefixed = prefix + selector.replace(/,/g, ',' + prefix); 249 | adapter = rsiblings.test(selector) && context.parentNode; 250 | if (!existed) { context.setAttribute('id', id); } 251 | } 252 | try { 253 | return (adapter || context).querySelectorAll(prefixed || selector); 254 | } catch (e) { 255 | return []; 256 | } finally { 257 | if (existed === null) { context.removeAttribute('id'); } 258 | } 259 | } 260 | 261 | function sektor (selector, ctx, collection, seed) { 262 | var element; 263 | var context = ctx || document; 264 | var results = collection || []; 265 | var i = 0; 266 | if (typeof selector !== 'string') { 267 | return results; 268 | } 269 | if (context.nodeType !== 1 && context.nodeType !== 9) { 270 | return []; // bail if context is not an element or document 271 | } 272 | if (seed) { 273 | while ((element = seed[i++])) { 274 | if (matchesSelector(element, selector)) { 275 | results.push(element); 276 | } 277 | } 278 | } else { 279 | results.push.apply(results, qsa(selector, context)); 280 | } 281 | return results; 282 | } 283 | 284 | function matches (selector, elements) { 285 | return sektor(selector, null, null, elements); 286 | } 287 | 288 | function matchesSelector (element, selector) { 289 | return match.call(element, selector); 290 | } 291 | 292 | function never () { return false; } 293 | 294 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 295 | 296 | },{}],7:[function(require,module,exports){ 297 | 'use strict'; 298 | 299 | var poser = require('poser'); 300 | var Dominus = poser.Array(); 301 | 302 | module.exports = Dominus; 303 | 304 | },{"poser":4}],8:[function(require,module,exports){ 305 | 'use strict'; 306 | 307 | var $ = require('./public'); 308 | var flatten = require('./flatten'); 309 | var dom = require('./dom'); 310 | var apply = require('./apply'); 311 | var custom = require('./custom'); 312 | var classes = require('./classes'); 313 | var Dominus = require('./Dominus.ctor'); 314 | 315 | function equals (selector) { 316 | return function equals (elem) { 317 | return dom.matches(elem, selector); 318 | }; 319 | } 320 | 321 | function straight (prop, one) { 322 | return function domMapping (selector) { 323 | var result = this.map(function (elem) { 324 | return dom[prop](elem, selector); 325 | }); 326 | var results = flatten(result); 327 | return one ? results[0] : results; 328 | }; 329 | } 330 | 331 | Dominus.prototype.prev = straight('prev'); 332 | Dominus.prototype.next = straight('next'); 333 | Dominus.prototype.parent = straight('parent'); 334 | Dominus.prototype.parents = straight('parents'); 335 | Dominus.prototype.children = straight('children'); 336 | Dominus.prototype.find = straight('qsa'); 337 | Dominus.prototype.findOne = straight('qs', true); 338 | 339 | Dominus.prototype.where = function (selector) { 340 | return this.filter(equals(selector)); 341 | }; 342 | 343 | Dominus.prototype.is = function (selector) { 344 | return this.some(equals(selector)); 345 | }; 346 | 347 | Dominus.prototype.i = function (index) { 348 | return this[index] ? new Dominus(this[index]) : new Dominus(); 349 | }; 350 | 351 | function compareFactory (fn) { 352 | return function compare () { 353 | var copy = apply(this); 354 | $.apply(null, arguments).forEach(fn, copy); 355 | return copy; 356 | }; 357 | } 358 | 359 | Dominus.prototype.and = compareFactory(function addOne (elem) { 360 | if (this.indexOf(elem) === -1) { 361 | this.push(elem); 362 | } 363 | return this; 364 | }); 365 | 366 | Dominus.prototype.but = compareFactory(function addOne (elem) { 367 | var index = this.indexOf(elem); 368 | if (index !== -1) { 369 | this.splice(index, 1); 370 | } 371 | return this; 372 | }); 373 | 374 | Dominus.prototype.css = function (name, value) { 375 | var props; 376 | var many = name && typeof name === 'object'; 377 | var getter = !many && !value; 378 | if (getter) { 379 | return this.length ? dom.getCss(this[0], name) : null; 380 | } 381 | if (many) { 382 | props = name; 383 | } else { 384 | props = {}; 385 | props[name] = value; 386 | } 387 | this.forEach(dom.setCss(props)); 388 | return this; 389 | }; 390 | 391 | function eventer (method) { 392 | return function (types, filter, fn) { 393 | var typelist = types.split(' '); 394 | if (typeof fn !== 'function') { 395 | fn = filter; 396 | filter = null; 397 | } 398 | this.forEach(function (elem) { 399 | typelist.forEach(function (type) { 400 | var handler = custom.handlers[type]; 401 | if (handler) { 402 | dom[method](elem, handler.event, filter, handler.wrap(fn)); 403 | } else { 404 | dom[method](elem, type, filter, fn); 405 | } 406 | }); 407 | }); 408 | return this; 409 | }; 410 | } 411 | 412 | Dominus.prototype.once = eventer('once'); 413 | Dominus.prototype.on = eventer('on'); 414 | Dominus.prototype.off = eventer('off'); 415 | Dominus.prototype.emit = eventer('emit'); 416 | 417 | [ 418 | ['addClass', classes.add], 419 | ['removeClass', classes.remove], 420 | ['setClass', classes.set], 421 | ['removeClass', classes.remove], 422 | ['remove', dom.remove] 423 | ].forEach(mapMethods); 424 | 425 | function mapMethods (data) { 426 | Dominus.prototype[data[0]] = function (value) { 427 | this.forEach(function (elem) { 428 | data[1](elem, value); 429 | }); 430 | return this; 431 | }; 432 | } 433 | 434 | [ 435 | 'append', 436 | 'appendTo', 437 | 'prepend', 438 | 'prependTo', 439 | 'before', 440 | 'beforeOf', 441 | 'after', 442 | 'afterOf' 443 | ].forEach(mapManipulation); 444 | 445 | function mapManipulation (method) { 446 | Dominus.prototype[method] = function (value) { 447 | dom[method](this, value); 448 | return this; 449 | }; 450 | } 451 | 452 | Dominus.prototype.hasClass = function (value) { 453 | return this.some(function (elem) { 454 | return classes.contains(elem, value); 455 | }); 456 | }; 457 | 458 | Dominus.prototype.attr = function (name, value) { 459 | var hash = name && typeof name === 'object'; 460 | var set = hash ? setMany : setSingle; 461 | var setter = hash || arguments.length > 1; 462 | if (setter) { 463 | this.forEach(set); 464 | return this; 465 | } else { 466 | return this.length ? dom.getAttr(this[0], name) : null; 467 | } 468 | function setMany (elem) { 469 | dom.manyAttr(elem, name); 470 | } 471 | function setSingle (elem) { 472 | dom.attr(elem, name, value); 473 | } 474 | }; 475 | 476 | function keyValue (key, value) { 477 | var getter = arguments.length < 2; 478 | if (getter) { 479 | return this.length ? dom[key](this[0]) : ''; 480 | } 481 | this.forEach(function (elem) { 482 | dom[key](elem, value); 483 | }); 484 | return this; 485 | } 486 | 487 | function keyValueProperty (prop) { 488 | Dominus.prototype[prop] = function accessor (value) { 489 | var getter = arguments.length < 1; 490 | if (getter) { 491 | return keyValue.call(this, prop); 492 | } 493 | return keyValue.call(this, prop, value); 494 | }; 495 | } 496 | 497 | ['html', 'text', 'value'].forEach(keyValueProperty); 498 | 499 | Dominus.prototype.clone = function () { 500 | return this.map(function (elem) { 501 | return dom.clone(elem); 502 | }); 503 | }; 504 | 505 | Dominus.prototype.focus = function () { 506 | if (this.length) { 507 | this[0].focus(); 508 | } 509 | return this; 510 | }; 511 | 512 | module.exports = require('./public'); 513 | 514 | },{"./Dominus.ctor":7,"./apply":9,"./classes":11,"./custom":12,"./dom":13,"./flatten":15,"./public":16}],9:[function(require,module,exports){ 515 | 'use strict'; 516 | 517 | var Dominus = require('./Dominus.ctor'); 518 | var proto = Dominus.prototype; 519 | 520 | function Applied (args) { 521 | return Dominus.apply(this, args); 522 | } 523 | 524 | Applied.prototype = proto; 525 | 526 | function apply (a) { 527 | return new Applied(a); 528 | } 529 | 530 | ['map', 'filter', 'concat', 'slice'].forEach(ensure); 531 | 532 | function ensure (key) { 533 | var original = proto[key]; 534 | proto[key] = function applied () { 535 | return apply(original.apply(this, arguments)); 536 | }; 537 | } 538 | 539 | module.exports = apply; 540 | 541 | },{"./Dominus.ctor":7}],10:[function(require,module,exports){ 542 | (function (global){ 543 | 'use strict'; 544 | 545 | var test = require('./test'); 546 | var apply = require('./apply'); 547 | var Dominus = require('./Dominus.ctor'); 548 | 549 | function cast (a) { 550 | if (a === global) { 551 | return new Dominus(a); 552 | } 553 | if (a instanceof Dominus) { 554 | return a; 555 | } 556 | if (!a) { 557 | return new Dominus(); 558 | } 559 | if (test.isElement(a)) { 560 | return new Dominus(a); 561 | } 562 | if (!test.isArray(a)) { 563 | return new Dominus(); 564 | } 565 | return apply(a).filter(function (i) { 566 | return test.isElement(i); 567 | }); 568 | } 569 | 570 | module.exports = cast; 571 | 572 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 573 | 574 | },{"./Dominus.ctor":7,"./apply":9,"./test":17}],11:[function(require,module,exports){ 575 | 'use strict'; 576 | 577 | var trim = /^\s+|\s+$/g; 578 | var whitespace = /\s+/g; 579 | var test = require('./test'); 580 | 581 | function interpret (input) { 582 | return typeof input === 'string' ? input.replace(trim, '').split(whitespace) : input; 583 | } 584 | 585 | function classes (el) { 586 | if (test.isElement(el)) { 587 | return el.className.replace(trim, '').split(whitespace); 588 | } 589 | return []; 590 | } 591 | 592 | function set (el, input) { 593 | if (test.isElement(el)) { 594 | el.className = interpret(input).join(' '); 595 | } 596 | } 597 | 598 | function add (el, input) { 599 | var current = remove(el, input); 600 | var values = interpret(input); 601 | current.push.apply(current, values); 602 | set(el, current); 603 | return current; 604 | } 605 | 606 | function remove (el, input) { 607 | var current = classes(el); 608 | var values = interpret(input); 609 | values.forEach(function (value) { 610 | var i = current.indexOf(value); 611 | if (i !== -1) { 612 | current.splice(i, 1); 613 | } 614 | }); 615 | set(el, current); 616 | return current; 617 | } 618 | 619 | function contains (el, input) { 620 | var current = classes(el); 621 | var values = interpret(input); 622 | 623 | return values.every(function (value) { 624 | return current.indexOf(value) !== -1; 625 | }); 626 | } 627 | 628 | module.exports = { 629 | add: add, 630 | remove: remove, 631 | contains: contains, 632 | set: set, 633 | get: classes 634 | }; 635 | 636 | },{"./test":17}],12:[function(require,module,exports){ 637 | 'use strict'; 638 | 639 | var handlers = {}; 640 | 641 | function register (name, type, filter) { 642 | handlers[name] = { 643 | event: type, 644 | filter: filter, 645 | wrap: wrap 646 | }; 647 | 648 | function wrap (fn) { 649 | return wrapper(name, fn); 650 | } 651 | } 652 | 653 | function wrapper (name, fn) { 654 | if (!fn) { 655 | return fn; 656 | } 657 | var key = '__dce_' + name; 658 | if (fn[key]) { 659 | return fn[key]; 660 | } 661 | fn[key] = function customEvent (e) { 662 | var match = handlers[name].filter(e); 663 | if (match) { 664 | return fn.apply(this, arguments); 665 | } 666 | }; 667 | return fn[key]; 668 | } 669 | 670 | register('left-click', 'click', function (e) { 671 | return e.which === 1 && !e.metaKey && !e.ctrlKey; 672 | }); 673 | 674 | module.exports = { 675 | register: register, 676 | wrapper: wrapper, 677 | handlers: handlers 678 | }; 679 | 680 | },{}],13:[function(require,module,exports){ 681 | (function (global){ 682 | 'use strict'; 683 | 684 | var sektor = require('sektor'); 685 | var crossvent = require('crossvent'); 686 | var Dominus = require('./Dominus.ctor'); 687 | var cast = require('./cast'); 688 | var apply = require('./apply'); 689 | var text = require('./text'); 690 | var test = require('./test'); 691 | var api = module.exports = {}; 692 | var delegates = {}; 693 | 694 | function castContext (context) { 695 | if (typeof context === 'string') { 696 | return api.qs(null, context); 697 | } 698 | if (test.isElement(context)) { 699 | return context; 700 | } 701 | if (context instanceof Dominus) { 702 | return context[0]; 703 | } 704 | return null; 705 | } 706 | 707 | api.qsa = function (el, selector) { 708 | var results = new Dominus(); 709 | return sektor(selector, castContext(el), results); 710 | }; 711 | 712 | api.qs = function (el, selector) { 713 | return api.qsa(el, selector)[0]; 714 | }; 715 | 716 | api.matches = function (el, selector) { 717 | return test.isElement(el) && sektor.matchesSelector(el, selector); 718 | }; 719 | 720 | function relatedFactory (prop) { 721 | return function related (el, selector) { 722 | var relative = el[prop]; 723 | if (relative) { 724 | if (!selector || api.matches(relative, selector)) { 725 | return cast(relative); 726 | } 727 | } 728 | return new Dominus(); 729 | }; 730 | } 731 | 732 | api.prev = relatedFactory('previousElementSibling'); 733 | api.next = relatedFactory('nextElementSibling'); 734 | api.parent = relatedFactory('parentElement'); 735 | 736 | function matches (el, value) { 737 | if (!value) { 738 | return true; 739 | } 740 | if (value instanceof Dominus) { 741 | return value.indexOf(el) !== -1; 742 | } 743 | if (test.isElement(value)) { 744 | return el === value; 745 | } 746 | return api.matches(el, value); 747 | } 748 | 749 | api.parents = function (el, value) { 750 | var elements = []; 751 | var current = el; 752 | while (current.parentElement) { 753 | if (matches(current.parentElement, value)) { 754 | elements.push(current.parentElement); 755 | } 756 | current = current.parentElement; 757 | } 758 | return apply(elements); 759 | }; 760 | 761 | api.children = function (el, value) { 762 | var elements = []; 763 | var children = el.children; 764 | var child; 765 | var i; 766 | for (i = 0; children && i < children.length; i++) { 767 | child = children[i]; 768 | if (matches(child, value)) { 769 | elements.push(child); 770 | } 771 | } 772 | return apply(elements); 773 | }; 774 | 775 | // this method caches delegates so that .off() works seamlessly 776 | function delegate (root, filter, fn) { 777 | if (delegates[fn._dd]) { 778 | return delegates[fn._dd]; 779 | } 780 | fn._dd = Date.now(); 781 | delegates[fn._dd] = delegator; 782 | function delegator (e) { 783 | var el = e.target; 784 | while (el && el !== root) { 785 | if (api.matches(el, filter)) { 786 | fn.apply(this, arguments); return; 787 | } 788 | el = el.parentElement; 789 | } 790 | } 791 | return delegator; 792 | } 793 | 794 | function evented (method, el, type, filter, fn) { 795 | if (filter === null) { 796 | crossvent[method](el, type, fn); 797 | } else { 798 | crossvent[method](el, type, delegate(el, filter, fn)); 799 | } 800 | } 801 | 802 | function once (el, type, filter, fn) { 803 | var things = [el, type, filter, disposable]; 804 | api.on.apply(api, things); 805 | function disposable () { 806 | api.off.apply(api, things); 807 | return fn.apply(this, arguments); 808 | } 809 | } 810 | 811 | api.once = once; 812 | api.on = evented.bind(null, 'add'); 813 | api.off = evented.bind(null, 'remove'); 814 | api.emit = evented.bind(null, 'fabricate'); 815 | 816 | api.html = function (elem, html) { 817 | var getter = arguments.length < 2; 818 | if (getter) { 819 | return elem.innerHTML; 820 | } else { 821 | elem.innerHTML = html; 822 | } 823 | }; 824 | 825 | api.text = function (elem, text) { 826 | var checkable = test.isCheckable(elem); 827 | var getter = arguments.length < 2; 828 | if (getter) { 829 | return checkable ? elem.value : elem.innerText || elem.textContent; 830 | } else if (checkable) { 831 | elem.value = text; 832 | } else { 833 | elem.innerText = elem.textContent = text; 834 | } 835 | }; 836 | 837 | api.value = function (el, value) { 838 | var checkable = test.isCheckable(el); 839 | var getter = arguments.length < 2; 840 | if (getter) { 841 | return checkable ? el.checked : el.value; 842 | } else if (checkable) { 843 | el.checked = value; 844 | } else { 845 | el.value = value; 846 | } 847 | }; 848 | 849 | api.attr = function (el, name, value) { 850 | if (!test.isElement(el)) { 851 | return; 852 | } 853 | if (value === null || value === void 0) { 854 | el.removeAttribute(name); return; 855 | } 856 | var camel = text.hyphenToCamel(name); 857 | if (camel in el) { 858 | el[camel] = value; 859 | } else { 860 | el.setAttribute(name, value); 861 | } 862 | }; 863 | 864 | api.getAttr = function (el, name) { 865 | var camel = text.hyphenToCamel(name); 866 | if (camel in el) { 867 | return el[camel]; 868 | } else if (el.getAttribute) { 869 | return el.getAttribute(name); 870 | } 871 | return null; 872 | }; 873 | 874 | api.manyAttr = function (elem, attrs) { 875 | Object.keys(attrs).forEach(function (attr) { 876 | api.attr(elem, attr, attrs[attr]); 877 | }); 878 | }; 879 | 880 | api.make = function (type) { 881 | return new Dominus(document.createElement(type)); 882 | }; 883 | 884 | api.clone = function (el) { 885 | if (el.cloneNode) { 886 | return el.cloneNode(true); 887 | } 888 | return el; 889 | }; 890 | 891 | api.remove = function (el) { 892 | if (el.parentElement) { 893 | el.parentElement.removeChild(el); 894 | } 895 | }; 896 | 897 | api.append = function (el, target) { 898 | if (manipulationGuard(el, target, api.append)) { 899 | return; 900 | } 901 | if (el.appendChild) { 902 | el.appendChild(target); 903 | } 904 | }; 905 | 906 | api.prepend = function (el, target) { 907 | if (manipulationGuard(el, target, api.prepend)) { 908 | return; 909 | } 910 | if (el.insertBefore) { 911 | el.insertBefore(target, el.firstChild); 912 | } 913 | }; 914 | 915 | api.before = function (el, target) { 916 | if (manipulationGuard(el, target, api.before)) { 917 | return; 918 | } 919 | if (el.parentElement) { 920 | el.parentElement.insertBefore(target, el); 921 | } 922 | }; 923 | 924 | api.after = function (el, target) { 925 | if (manipulationGuard(el, target, api.after)) { 926 | return; 927 | } 928 | if (el.parentElement) { 929 | el.parentElement.insertBefore(target, el.nextSibling); 930 | } 931 | }; 932 | 933 | function manipulationGuard (el, target, fn) { 934 | var right = target instanceof Dominus; 935 | var left = el instanceof Dominus; 936 | if (left) { 937 | el.forEach(manipulateMany); 938 | } else if (right) { 939 | manipulate(el, true); 940 | } 941 | return !el || !target || left || right; 942 | 943 | function manipulate (el, precondition) { 944 | if (right) { 945 | target.forEach(function (target, j) { 946 | fn(el, cloneUnless(target, precondition && j === 0)); 947 | }); 948 | } else { 949 | fn(el, cloneUnless(target, precondition)); 950 | } 951 | } 952 | 953 | function manipulateMany (el, i) { 954 | manipulate(el, i === 0); 955 | } 956 | } 957 | 958 | function cloneUnless (target, condition) { 959 | return condition ? target : api.clone(target); 960 | } 961 | 962 | ['appendTo', 'prependTo', 'beforeOf', 'afterOf'].forEach(flip); 963 | 964 | function flip (key) { 965 | var original = key.split(/[A-Z]/)[0]; 966 | api[key] = function (el, target) { 967 | api[original](target, el); 968 | }; 969 | } 970 | 971 | var numericCssProperties = { 972 | 'column-count': true, 973 | 'fill-opacity': true, 974 | 'flex-grow': true, 975 | 'flex-shrink': true, 976 | 'font-weight': true, 977 | 'line-height': true, 978 | 'opacity': true, 979 | 'order': true, 980 | 'orphans': true, 981 | 'widows': true, 982 | 'z-index': true, 983 | 'zoom': true 984 | }; 985 | var numeric = /^\d+$/; 986 | var canFloat = 'float' in document.body.style; 987 | 988 | api.getCss = function (el, prop) { 989 | if (!test.isElement(el)) { 990 | return null; 991 | } 992 | var hprop = text.hyphenate(prop); 993 | var fprop = !canFloat && hprop === 'float' ? 'cssFloat' : hprop; 994 | var result = global.getComputedStyle(el)[hprop]; 995 | if (prop === 'opacity' && result === '') { 996 | return 1; 997 | } 998 | if (result.substr(-2) === 'px' || numeric.test(result)) { 999 | return parseFloat(result, 10); 1000 | } 1001 | return result; 1002 | }; 1003 | 1004 | api.setCss = function (props) { 1005 | var mapped = Object.keys(props).filter(bad).map(expand); 1006 | function bad (prop) { 1007 | var value = props[prop]; 1008 | return value !== null && value === value; 1009 | } 1010 | function expand (prop) { 1011 | var hprop = text.hyphenate(prop); 1012 | var value = props[prop]; 1013 | if (typeof value === 'number' && !numericCssProperties[hprop]) { 1014 | value += 'px'; 1015 | } 1016 | return { 1017 | name: hprop, value: value 1018 | }; 1019 | } 1020 | return function (el) { 1021 | if (!test.isElement(el)) { 1022 | return; 1023 | } 1024 | mapped.forEach(function (prop) { 1025 | el.style[prop.name] = prop.value; 1026 | }); 1027 | }; 1028 | }; 1029 | 1030 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 1031 | 1032 | },{"./Dominus.ctor":7,"./apply":9,"./cast":10,"./test":17,"./text":18,"crossvent":1,"sektor":6}],14:[function(require,module,exports){ 1033 | 'use strict'; 1034 | 1035 | module.exports = require('./Dominus.prototype'); 1036 | 1037 | },{"./Dominus.prototype":8}],15:[function(require,module,exports){ 1038 | 'use strict'; 1039 | 1040 | var Dominus = require('./Dominus.ctor'); 1041 | 1042 | function flatten (a, cache) { 1043 | return a.reduce(function (current, item) { 1044 | if (Dominus.isArray(item)) { 1045 | return flatten(item, current); 1046 | } else if (current.indexOf(item) === -1) { 1047 | return current.concat(item); 1048 | } 1049 | return current; 1050 | }, cache || new Dominus()); 1051 | } 1052 | 1053 | module.exports = flatten; 1054 | 1055 | },{"./Dominus.ctor":7}],16:[function(require,module,exports){ 1056 | 'use strict'; 1057 | 1058 | var dom = require('./dom'); 1059 | var cast = require('./cast'); 1060 | var custom = require('./custom'); 1061 | var Dominus = require('./Dominus.ctor'); 1062 | var tag = /^\s*<([a-z]+(?:-[a-z]+)?)\s*\/?>\s*$/i; 1063 | 1064 | function api (selector, context) { 1065 | var notText = typeof selector !== 'string'; 1066 | if (notText && arguments.length < 2) { 1067 | return cast(selector); 1068 | } 1069 | if (notText) { 1070 | return new Dominus(); 1071 | } 1072 | var matches = selector.match(tag); 1073 | if (matches) { 1074 | return dom.make(matches[1]); 1075 | } 1076 | return api.find(selector, context); 1077 | } 1078 | 1079 | api.find = function (selector, context) { 1080 | return dom.qsa(context, selector); 1081 | }; 1082 | 1083 | api.findOne = function (selector, context) { 1084 | return dom.qs(context, selector); 1085 | }; 1086 | 1087 | api.custom = custom.register; 1088 | 1089 | module.exports = api; 1090 | 1091 | },{"./Dominus.ctor":7,"./cast":10,"./custom":12,"./dom":13}],17:[function(require,module,exports){ 1092 | 'use strict'; 1093 | 1094 | var elementObjects = typeof HTMLElement === 'object'; 1095 | 1096 | function isElement (o) { 1097 | return elementObjects ? o instanceof HTMLElement : isElementObject(o); 1098 | } 1099 | 1100 | function isElementObject (o) { 1101 | return o && 1102 | typeof o === 'object' && 1103 | typeof o.nodeName === 'string' && 1104 | o.nodeType === 1; 1105 | } 1106 | 1107 | function isArray (a) { 1108 | return Object.prototype.toString.call(a) === '[object Array]'; 1109 | } 1110 | 1111 | function isCheckable (elem) { 1112 | return 'checked' in elem && elem.type === 'radio' || elem.type === 'checkbox'; 1113 | } 1114 | 1115 | module.exports = { 1116 | isElement: isElement, 1117 | isArray: isArray, 1118 | isCheckable: isCheckable 1119 | }; 1120 | 1121 | },{}],18:[function(require,module,exports){ 1122 | 'use strict'; 1123 | 1124 | function hyphenToCamel (hyphens) { 1125 | var part = /-([a-z])/g; 1126 | return hyphens.replace(part, function (g, m) { 1127 | return m.toUpperCase(); 1128 | }); 1129 | } 1130 | 1131 | function hyphenate (text) { 1132 | var camel = /([a-z])([A-Z])/g; 1133 | return text.replace(camel, '$1-$2').toLowerCase(); 1134 | } 1135 | 1136 | module.exports = { 1137 | hyphenToCamel: hyphenToCamel, 1138 | hyphenate: hyphenate 1139 | }; 1140 | 1141 | },{}]},{},[14])(14) 1142 | }); 1143 | //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvY3Jvc3N2ZW50L3NyYy9jcm9zc3ZlbnQuanMiLCJub2RlX21vZHVsZXMvY3Jvc3N2ZW50L3NyYy9ldmVudG1hcC5qcyIsIm5vZGVfbW9kdWxlcy9jdXN0b20tZXZlbnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcG9zZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcG9zZXIvc3JjL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvc2VrdG9yL3NyYy9zZWt0b3IuanMiLCJzcmMvRG9taW51cy5jdG9yLmpzIiwic3JjL0RvbWludXMucHJvdG90eXBlLmpzIiwic3JjL2FwcGx5LmpzIiwic3JjL2Nhc3QuanMiLCJzcmMvY2xhc3Nlcy5qcyIsInNyYy9jdXN0b20uanMiLCJzcmMvZG9tLmpzIiwic3JjL2RvbWludXMuanMiLCJzcmMvZmxhdHRlbi5qcyIsInNyYy9wdWJsaWMuanMiLCJzcmMvdGVzdC5qcyIsInNyYy90ZXh0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNyR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM1ZBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIid1c2Ugc3RyaWN0JztcblxudmFyIGN1c3RvbUV2ZW50ID0gcmVxdWlyZSgnY3VzdG9tLWV2ZW50Jyk7XG52YXIgZXZlbnRtYXAgPSByZXF1aXJlKCcuL2V2ZW50bWFwJyk7XG52YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIGFkZEV2ZW50ID0gYWRkRXZlbnRFYXN5O1xudmFyIHJlbW92ZUV2ZW50ID0gcmVtb3ZlRXZlbnRFYXN5O1xudmFyIGhhcmRDYWNoZSA9IFtdO1xuXG5pZiAoIWdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gIGFkZEV2ZW50ID0gYWRkRXZlbnRIYXJkO1xuICByZW1vdmVFdmVudCA9IHJlbW92ZUV2ZW50SGFyZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFkZDogYWRkRXZlbnQsXG4gIHJlbW92ZTogcmVtb3ZlRXZlbnQsXG4gIGZhYnJpY2F0ZTogZmFicmljYXRlRXZlbnRcbn07XG5cbmZ1bmN0aW9uIGFkZEV2ZW50RWFzeSAoZWwsIHR5cGUsIGZuLCBjYXB0dXJpbmcpIHtcbiAgcmV0dXJuIGVsLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZm4sIGNhcHR1cmluZyk7XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50SGFyZCAoZWwsIHR5cGUsIGZuKSB7XG4gIHJldHVybiBlbC5hdHRhY2hFdmVudCgnb24nICsgdHlwZSwgd3JhcChlbCwgdHlwZSwgZm4pKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRXZlbnRFYXN5IChlbCwgdHlwZSwgZm4sIGNhcHR1cmluZykge1xuICByZXR1cm4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgY2FwdHVyaW5nKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRXZlbnRIYXJkIChlbCwgdHlwZSwgZm4pIHtcbiAgdmFyIGxpc3RlbmVyID0gdW53cmFwKGVsLCB0eXBlLCBmbik7XG4gIGlmIChsaXN0ZW5lcikge1xuICAgIHJldHVybiBlbC5kZXRhY2hFdmVudCgnb24nICsgdHlwZSwgbGlzdGVuZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZhYnJpY2F0ZUV2ZW50IChlbCwgdHlwZSwgbW9kZWwpIHtcbiAgdmFyIGUgPSBldmVudG1hcC5pbmRleE9mKHR5cGUpID09PSAtMSA/IG1ha2VDdXN0b21FdmVudCgpIDogbWFrZUNsYXNzaWNFdmVudCgpO1xuICBpZiAoZWwuZGlzcGF0Y2hFdmVudCkge1xuICAgIGVsLmRpc3BhdGNoRXZlbnQoZSk7XG4gIH0gZWxzZSB7XG4gICAgZWwuZmlyZUV2ZW50KCdvbicgKyB0eXBlLCBlKTtcbiAgfVxuICBmdW5jdGlvbiBtYWtlQ2xhc3NpY0V2ZW50ICgpIHtcbiAgICB2YXIgZTtcbiAgICBpZiAoZG9jLmNyZWF0ZUV2ZW50KSB7XG4gICAgICBlID0gZG9jLmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgZS5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChkb2MuY3JlYXRlRXZlbnRPYmplY3QpIHtcbiAgICAgIGUgPSBkb2MuY3JlYXRlRXZlbnRPYmplY3QoKTtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH1cbiAgZnVuY3Rpb24gbWFrZUN1c3RvbUV2ZW50ICgpIHtcbiAgICByZXR1cm4gbmV3IGN1c3RvbUV2ZW50KHR5cGUsIHsgZGV0YWlsOiBtb2RlbCB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3cmFwcGVyRmFjdG9yeSAoZWwsIHR5cGUsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwcGVyIChvcmlnaW5hbEV2ZW50KSB7XG4gICAgdmFyIGUgPSBvcmlnaW5hbEV2ZW50IHx8IGdsb2JhbC5ldmVudDtcbiAgICBlLnRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbiAgICBlLnByZXZlbnREZWZhdWx0ID0gZS5wcmV2ZW50RGVmYXVsdCB8fCBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCAoKSB7IGUucmV0dXJuVmFsdWUgPSBmYWxzZTsgfTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbiA9IGUuc3RvcFByb3BhZ2F0aW9uIHx8IGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbiAoKSB7IGUuY2FuY2VsQnViYmxlID0gdHJ1ZTsgfTtcbiAgICBlLndoaWNoID0gZS53aGljaCB8fCBlLmtleUNvZGU7XG4gICAgZm4uY2FsbChlbCwgZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHdyYXAgKGVsLCB0eXBlLCBmbikge1xuICB2YXIgd3JhcHBlciA9IHVud3JhcChlbCwgdHlwZSwgZm4pIHx8IHdyYXBwZXJGYWN0b3J5KGVsLCB0eXBlLCBmbik7XG4gIGhhcmRDYWNoZS5wdXNoKHtcbiAgICB3cmFwcGVyOiB3cmFwcGVyLFxuICAgIGVsZW1lbnQ6IGVsLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgZm46IGZuXG4gIH0pO1xuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuZnVuY3Rpb24gdW53cmFwIChlbCwgdHlwZSwgZm4pIHtcbiAgdmFyIGkgPSBmaW5kKGVsLCB0eXBlLCBmbik7XG4gIGlmIChpKSB7XG4gICAgdmFyIHdyYXBwZXIgPSBoYXJkQ2FjaGVbaV0ud3JhcHBlcjtcbiAgICBoYXJkQ2FjaGUuc3BsaWNlKGksIDEpOyAvLyBmcmVlIHVwIGEgdGFkIG9mIG1lbW9yeVxuICAgIHJldHVybiB3cmFwcGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmQgKGVsLCB0eXBlLCBmbikge1xuICB2YXIgaSwgaXRlbTtcbiAgZm9yIChpID0gMDsgaSA8IGhhcmRDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgIGl0ZW0gPSBoYXJkQ2FjaGVbaV07XG4gICAgaWYgKGl0ZW0uZWxlbWVudCA9PT0gZWwgJiYgaXRlbS50eXBlID09PSB0eXBlICYmIGl0ZW0uZm4gPT09IGZuKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGV2ZW50bWFwID0gW107XG52YXIgZXZlbnRuYW1lID0gJyc7XG52YXIgcm9uID0gL15vbi87XG5cbmZvciAoZXZlbnRuYW1lIGluIGdsb2JhbCkge1xuICBpZiAocm9uLnRlc3QoZXZlbnRuYW1lKSkge1xuICAgIGV2ZW50bWFwLnB1c2goZXZlbnRuYW1lLnNsaWNlKDIpKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV2ZW50bWFwO1xuIiwiXG52YXIgTmF0aXZlQ3VzdG9tRXZlbnQgPSBnbG9iYWwuQ3VzdG9tRXZlbnQ7XG5cbmZ1bmN0aW9uIHVzZU5hdGl2ZSAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHAgPSBuZXcgTmF0aXZlQ3VzdG9tRXZlbnQoJ2NhdCcsIHsgZGV0YWlsOiB7IGZvbzogJ2JhcicgfSB9KTtcbiAgICByZXR1cm4gICdjYXQnID09PSBwLnR5cGUgJiYgJ2JhcicgPT09IHAuZGV0YWlsLmZvbztcbiAgfSBjYXRjaCAoZSkge1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDcm9zcy1icm93c2VyIGBDdXN0b21FdmVudGAgY29uc3RydWN0b3IuXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0N1c3RvbUV2ZW50LkN1c3RvbUV2ZW50XG4gKlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdXNlTmF0aXZlKCkgPyBOYXRpdmVDdXN0b21FdmVudCA6XG5cbi8vIElFID49IDlcbidmdW5jdGlvbicgPT09IHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA/IGZ1bmN0aW9uIEN1c3RvbUV2ZW50ICh0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgaWYgKHBhcmFtcykge1xuICAgIGUuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gIH0gZWxzZSB7XG4gICAgZS5pbml0Q3VzdG9tRXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlLCB2b2lkIDApO1xuICB9XG4gIHJldHVybiBlO1xufSA6XG5cbi8vIElFIDw9IDhcbmZ1bmN0aW9uIEN1c3RvbUV2ZW50ICh0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpO1xuICBlLnR5cGUgPSB0eXBlO1xuICBpZiAocGFyYW1zKSB7XG4gICAgZS5idWJibGVzID0gQm9vbGVhbihwYXJhbXMuYnViYmxlcyk7XG4gICAgZS5jYW5jZWxhYmxlID0gQm9vbGVhbihwYXJhbXMuY2FuY2VsYWJsZSk7XG4gICAgZS5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsO1xuICB9IGVsc2Uge1xuICAgIGUuYnViYmxlcyA9IGZhbHNlO1xuICAgIGUuY2FuY2VsYWJsZSA9IGZhbHNlO1xuICAgIGUuZGV0YWlsID0gdm9pZCAwO1xuICB9XG4gIHJldHVybiBlO1xufVxuIiwidmFyIHBvc2VyID0gcmVxdWlyZSgnLi9zcmMvbm9kZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvc2VyO1xuXG5bJ0FycmF5JywgJ0Z1bmN0aW9uJywgJ09iamVjdCcsICdEYXRlJywgJ1N0cmluZyddLmZvckVhY2gocG9zZSk7XG5cbmZ1bmN0aW9uIHBvc2UgKHR5cGUpIHtcbiAgcG9zZXJbdHlwZV0gPSBmdW5jdGlvbiBwb3NlQ29tcHV0ZWRUeXBlICgpIHsgcmV0dXJuIHBvc2VyKHR5cGUpOyB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZCA9IGdsb2JhbC5kb2N1bWVudDtcblxuZnVuY3Rpb24gcG9zZXIgKHR5cGUpIHtcbiAgdmFyIGlmcmFtZSA9IGQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG5cbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGQuYm9keS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuXG4gIHJldHVybiBtYXAodHlwZSwgaWZyYW1lLmNvbnRlbnRXaW5kb3cpO1xufVxuXG5mdW5jdGlvbiBtYXAgKHR5cGUsIHNvdXJjZSkgeyAvLyBmb3J3YXJkIHBvbHlmaWxscyB0byB0aGUgc3RvbGVuIHJlZmVyZW5jZSFcbiAgdmFyIG9yaWdpbmFsID0gd2luZG93W3R5cGVdLnByb3RvdHlwZTtcbiAgdmFyIHZhbHVlID0gc291cmNlW3R5cGVdO1xuICB2YXIgcHJvcDtcblxuICBmb3IgKHByb3AgaW4gb3JpZ2luYWwpIHtcbiAgICB2YWx1ZS5wcm90b3R5cGVbcHJvcF0gPSBvcmlnaW5hbFtwcm9wXTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwb3NlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGV4cGFuZG8gPSAnc2VrdG9yLScgKyBEYXRlLm5vdygpO1xudmFyIHJzaWJsaW5ncyA9IC9bK35dLztcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBkZWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwge307XG52YXIgbWF0Y2ggPSAoXG4gIGRlbC5tYXRjaGVzIHx8XG4gIGRlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcbiAgZGVsLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuICBkZWwub01hdGNoZXNTZWxlY3RvciB8fFxuICBkZWwubXNNYXRjaGVzU2VsZWN0b3IgfHxcbiAgbmV2ZXJcbik7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VrdG9yO1xuXG5zZWt0b3IubWF0Y2hlcyA9IG1hdGNoZXM7XG5zZWt0b3IubWF0Y2hlc1NlbGVjdG9yID0gbWF0Y2hlc1NlbGVjdG9yO1xuXG5mdW5jdGlvbiBxc2EgKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gIHZhciBleGlzdGVkLCBpZCwgcHJlZml4LCBwcmVmaXhlZCwgYWRhcHRlciwgaGFjayA9IGNvbnRleHQgIT09IGRvY3VtZW50O1xuICBpZiAoaGFjaykgeyAvLyBpZCBoYWNrIGZvciBjb250ZXh0LXJvb3RlZCBxdWVyaWVzXG4gICAgZXhpc3RlZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgIGlkID0gZXhpc3RlZCB8fCBleHBhbmRvO1xuICAgIHByZWZpeCA9ICcjJyArIGlkICsgJyAnO1xuICAgIHByZWZpeGVkID0gcHJlZml4ICsgc2VsZWN0b3IucmVwbGFjZSgvLC9nLCAnLCcgKyBwcmVmaXgpO1xuICAgIGFkYXB0ZXIgPSByc2libGluZ3MudGVzdChzZWxlY3RvcikgJiYgY29udGV4dC5wYXJlbnROb2RlO1xuICAgIGlmICghZXhpc3RlZCkgeyBjb250ZXh0LnNldEF0dHJpYnV0ZSgnaWQnLCBpZCk7IH1cbiAgfVxuICB0cnkge1xuICAgIHJldHVybiAoYWRhcHRlciB8fCBjb250ZXh0KS5xdWVyeVNlbGVjdG9yQWxsKHByZWZpeGVkIHx8IHNlbGVjdG9yKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBbXTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoZXhpc3RlZCA9PT0gbnVsbCkgeyBjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNla3RvciAoc2VsZWN0b3IsIGN0eCwgY29sbGVjdGlvbiwgc2VlZCkge1xuICB2YXIgZWxlbWVudDtcbiAgdmFyIGNvbnRleHQgPSBjdHggfHwgZG9jdW1lbnQ7XG4gIHZhciByZXN1bHRzID0gY29sbGVjdGlvbiB8fCBbXTtcbiAgdmFyIGkgPSAwO1xuICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIGlmIChjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkpIHtcbiAgICByZXR1cm4gW107IC8vIGJhaWwgaWYgY29udGV4dCBpcyBub3QgYW4gZWxlbWVudCBvciBkb2N1bWVudFxuICB9XG4gIGlmIChzZWVkKSB7XG4gICAgd2hpbGUgKChlbGVtZW50ID0gc2VlZFtpKytdKSkge1xuICAgICAgaWYgKG1hdGNoZXNTZWxlY3RvcihlbGVtZW50LCBzZWxlY3RvcikpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN1bHRzLnB1c2guYXBwbHkocmVzdWx0cywgcXNhKHNlbGVjdG9yLCBjb250ZXh0KSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXMgKHNlbGVjdG9yLCBlbGVtZW50cykge1xuICByZXR1cm4gc2VrdG9yKHNlbGVjdG9yLCBudWxsLCBudWxsLCBlbGVtZW50cyk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvciAoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgcmV0dXJuIG1hdGNoLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xufVxuXG5mdW5jdGlvbiBuZXZlciAoKSB7IHJldHVybiBmYWxzZTsgfVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcG9zZXIgPSByZXF1aXJlKCdwb3NlcicpO1xudmFyIERvbWludXMgPSBwb3Nlci5BcnJheSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERvbWludXM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciAkID0gcmVxdWlyZSgnLi9wdWJsaWMnKTtcbnZhciBmbGF0dGVuID0gcmVxdWlyZSgnLi9mbGF0dGVuJyk7XG52YXIgZG9tID0gcmVxdWlyZSgnLi9kb20nKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4vYXBwbHknKTtcbnZhciBjdXN0b20gPSByZXF1aXJlKCcuL2N1c3RvbScpO1xudmFyIGNsYXNzZXMgPSByZXF1aXJlKCcuL2NsYXNzZXMnKTtcbnZhciBEb21pbnVzID0gcmVxdWlyZSgnLi9Eb21pbnVzLmN0b3InKTtcblxuZnVuY3Rpb24gZXF1YWxzIChzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24gZXF1YWxzIChlbGVtKSB7XG4gICAgcmV0dXJuIGRvbS5tYXRjaGVzKGVsZW0sIHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3RyYWlnaHQgKHByb3AsIG9uZSkge1xuICByZXR1cm4gZnVuY3Rpb24gZG9tTWFwcGluZyAoc2VsZWN0b3IpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5tYXAoZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgIHJldHVybiBkb21bcHJvcF0oZWxlbSwgc2VsZWN0b3IpO1xuICAgIH0pO1xuICAgIHZhciByZXN1bHRzID0gZmxhdHRlbihyZXN1bHQpO1xuICAgIHJldHVybiBvbmUgPyByZXN1bHRzWzBdIDogcmVzdWx0cztcbiAgfTtcbn1cblxuRG9taW51cy5wcm90b3R5cGUucHJldiA9IHN0cmFpZ2h0KCdwcmV2Jyk7XG5Eb21pbnVzLnByb3RvdHlwZS5uZXh0ID0gc3RyYWlnaHQoJ25leHQnKTtcbkRvbWludXMucHJvdG90eXBlLnBhcmVudCA9IHN0cmFpZ2h0KCdwYXJlbnQnKTtcbkRvbWludXMucHJvdG90eXBlLnBhcmVudHMgPSBzdHJhaWdodCgncGFyZW50cycpO1xuRG9taW51cy5wcm90b3R5cGUuY2hpbGRyZW4gPSBzdHJhaWdodCgnY2hpbGRyZW4nKTtcbkRvbWludXMucHJvdG90eXBlLmZpbmQgPSBzdHJhaWdodCgncXNhJyk7XG5Eb21pbnVzLnByb3RvdHlwZS5maW5kT25lID0gc3RyYWlnaHQoJ3FzJywgdHJ1ZSk7XG5cbkRvbWludXMucHJvdG90eXBlLndoZXJlID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0aGlzLmZpbHRlcihlcXVhbHMoc2VsZWN0b3IpKTtcbn07XG5cbkRvbWludXMucHJvdG90eXBlLmlzID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0aGlzLnNvbWUoZXF1YWxzKHNlbGVjdG9yKSk7XG59O1xuXG5Eb21pbnVzLnByb3RvdHlwZS5pID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gIHJldHVybiB0aGlzW2luZGV4XSA/IG5ldyBEb21pbnVzKHRoaXNbaW5kZXhdKSA6IG5ldyBEb21pbnVzKCk7XG59O1xuXG5mdW5jdGlvbiBjb21wYXJlRmFjdG9yeSAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXBhcmUgKCkge1xuICAgIHZhciBjb3B5ID0gYXBwbHkodGhpcyk7XG4gICAgJC5hcHBseShudWxsLCBhcmd1bWVudHMpLmZvckVhY2goZm4sIGNvcHkpO1xuICAgIHJldHVybiBjb3B5O1xuICB9O1xufVxuXG5Eb21pbnVzLnByb3RvdHlwZS5hbmQgPSBjb21wYXJlRmFjdG9yeShmdW5jdGlvbiBhZGRPbmUgKGVsZW0pIHtcbiAgaWYgKHRoaXMuaW5kZXhPZihlbGVtKSA9PT0gLTEpIHtcbiAgICB0aGlzLnB1c2goZWxlbSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59KTtcblxuRG9taW51cy5wcm90b3R5cGUuYnV0ID0gY29tcGFyZUZhY3RvcnkoZnVuY3Rpb24gYWRkT25lIChlbGVtKSB7XG4gIHZhciBpbmRleCA9IHRoaXMuaW5kZXhPZihlbGVtKTtcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIHRoaXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn0pO1xuXG5Eb21pbnVzLnByb3RvdHlwZS5jc3MgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgdmFyIHByb3BzO1xuICB2YXIgbWFueSA9IG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnO1xuICB2YXIgZ2V0dGVyID0gIW1hbnkgJiYgIXZhbHVlO1xuICBpZiAoZ2V0dGVyKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID8gZG9tLmdldENzcyh0aGlzWzBdLCBuYW1lKSA6IG51bGw7XG4gIH1cbiAgaWYgKG1hbnkpIHtcbiAgICBwcm9wcyA9IG5hbWU7XG4gIH0gZWxzZSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgICBwcm9wc1tuYW1lXSA9IHZhbHVlO1xuICB9XG4gIHRoaXMuZm9yRWFjaChkb20uc2V0Q3NzKHByb3BzKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZXZlbnRlciAobWV0aG9kKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodHlwZXMsIGZpbHRlciwgZm4pIHtcbiAgICB2YXIgdHlwZWxpc3QgPSB0eXBlcy5zcGxpdCgnICcpO1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZuID0gZmlsdGVyO1xuICAgICAgZmlsdGVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgICB0eXBlbGlzdC5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciBoYW5kbGVyID0gY3VzdG9tLmhhbmRsZXJzW3R5cGVdO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGRvbVttZXRob2RdKGVsZW0sIGhhbmRsZXIuZXZlbnQsIGZpbHRlciwgaGFuZGxlci53cmFwKGZuKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9tW21ldGhvZF0oZWxlbSwgdHlwZSwgZmlsdGVyLCBmbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5Eb21pbnVzLnByb3RvdHlwZS5vbmNlID0gZXZlbnRlcignb25jZScpO1xuRG9taW51cy5wcm90b3R5cGUub24gPSBldmVudGVyKCdvbicpO1xuRG9taW51cy5wcm90b3R5cGUub2ZmID0gZXZlbnRlcignb2ZmJyk7XG5Eb21pbnVzLnByb3RvdHlwZS5lbWl0ID0gZXZlbnRlcignZW1pdCcpO1xuXG5bXG4gIFsnYWRkQ2xhc3MnLCBjbGFzc2VzLmFkZF0sXG4gIFsncmVtb3ZlQ2xhc3MnLCBjbGFzc2VzLnJlbW92ZV0sXG4gIFsnc2V0Q2xhc3MnLCBjbGFzc2VzLnNldF0sXG4gIFsncmVtb3ZlQ2xhc3MnLCBjbGFzc2VzLnJlbW92ZV0sXG4gIFsncmVtb3ZlJywgZG9tLnJlbW92ZV1cbl0uZm9yRWFjaChtYXBNZXRob2RzKTtcblxuZnVuY3Rpb24gbWFwTWV0aG9kcyAoZGF0YSkge1xuICBEb21pbnVzLnByb3RvdHlwZVtkYXRhWzBdXSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgZGF0YVsxXShlbGVtLCB2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbltcbiAgJ2FwcGVuZCcsXG4gICdhcHBlbmRUbycsXG4gICdwcmVwZW5kJyxcbiAgJ3ByZXBlbmRUbycsXG4gICdiZWZvcmUnLFxuICAnYmVmb3JlT2YnLFxuICAnYWZ0ZXInLFxuICAnYWZ0ZXJPZidcbl0uZm9yRWFjaChtYXBNYW5pcHVsYXRpb24pO1xuXG5mdW5jdGlvbiBtYXBNYW5pcHVsYXRpb24gKG1ldGhvZCkge1xuICBEb21pbnVzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgZG9tW21ldGhvZF0odGhpcywgdmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5Eb21pbnVzLnByb3RvdHlwZS5oYXNDbGFzcyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5zb21lKGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgcmV0dXJuIGNsYXNzZXMuY29udGFpbnMoZWxlbSwgdmFsdWUpO1xuICB9KTtcbn07XG5cbkRvbWludXMucHJvdG90eXBlLmF0dHIgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgdmFyIGhhc2ggPSBuYW1lICYmIHR5cGVvZiBuYW1lID09PSAnb2JqZWN0JztcbiAgdmFyIHNldCA9IGhhc2ggPyBzZXRNYW55IDogc2V0U2luZ2xlO1xuICB2YXIgc2V0dGVyID0gaGFzaCB8fCBhcmd1bWVudHMubGVuZ3RoID4gMTtcbiAgaWYgKHNldHRlcikge1xuICAgIHRoaXMuZm9yRWFjaChzZXQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA/IGRvbS5nZXRBdHRyKHRoaXNbMF0sIG5hbWUpIDogbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBzZXRNYW55IChlbGVtKSB7XG4gICAgZG9tLm1hbnlBdHRyKGVsZW0sIG5hbWUpO1xuICB9XG4gIGZ1bmN0aW9uIHNldFNpbmdsZSAoZWxlbSkge1xuICAgIGRvbS5hdHRyKGVsZW0sIG5hbWUsIHZhbHVlKTtcbiAgfVxufTtcblxuZnVuY3Rpb24ga2V5VmFsdWUgKGtleSwgdmFsdWUpIHtcbiAgdmFyIGdldHRlciA9IGFyZ3VtZW50cy5sZW5ndGggPCAyO1xuICBpZiAoZ2V0dGVyKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID8gZG9tW2tleV0odGhpc1swXSkgOiAnJztcbiAgfVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGVsZW0pIHtcbiAgICBkb21ba2V5XShlbGVtLCB2YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24ga2V5VmFsdWVQcm9wZXJ0eSAocHJvcCkge1xuICBEb21pbnVzLnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uIGFjY2Vzc29yICh2YWx1ZSkge1xuICAgIHZhciBnZXR0ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMTtcbiAgICBpZiAoZ2V0dGVyKSB7XG4gICAgICByZXR1cm4ga2V5VmFsdWUuY2FsbCh0aGlzLCBwcm9wKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleVZhbHVlLmNhbGwodGhpcywgcHJvcCwgdmFsdWUpO1xuICB9O1xufVxuXG5bJ2h0bWwnLCAndGV4dCcsICd2YWx1ZSddLmZvckVhY2goa2V5VmFsdWVQcm9wZXJ0eSk7XG5cbkRvbWludXMucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGVsZW0pIHtcbiAgICByZXR1cm4gZG9tLmNsb25lKGVsZW0pO1xuICB9KTtcbn07XG5cbkRvbWludXMucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5sZW5ndGgpIHtcbiAgICB0aGlzWzBdLmZvY3VzKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vcHVibGljJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBEb21pbnVzID0gcmVxdWlyZSgnLi9Eb21pbnVzLmN0b3InKTtcbnZhciBwcm90byA9IERvbWludXMucHJvdG90eXBlO1xuXG5mdW5jdGlvbiBBcHBsaWVkIChhcmdzKSB7XG4gIHJldHVybiBEb21pbnVzLmFwcGx5KHRoaXMsIGFyZ3MpO1xufVxuXG5BcHBsaWVkLnByb3RvdHlwZSA9IHByb3RvO1xuXG5mdW5jdGlvbiBhcHBseSAoYSkge1xuICByZXR1cm4gbmV3IEFwcGxpZWQoYSk7XG59XG5cblsnbWFwJywgJ2ZpbHRlcicsICdjb25jYXQnLCAnc2xpY2UnXS5mb3JFYWNoKGVuc3VyZSk7XG5cbmZ1bmN0aW9uIGVuc3VyZSAoa2V5KSB7XG4gIHZhciBvcmlnaW5hbCA9IHByb3RvW2tleV07XG4gIHByb3RvW2tleV0gPSBmdW5jdGlvbiBhcHBsaWVkICgpIHtcbiAgICByZXR1cm4gYXBwbHkob3JpZ2luYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwbHk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0ZXN0ID0gcmVxdWlyZSgnLi90ZXN0Jyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuL2FwcGx5Jyk7XG52YXIgRG9taW51cyA9IHJlcXVpcmUoJy4vRG9taW51cy5jdG9yJyk7XG5cbmZ1bmN0aW9uIGNhc3QgKGEpIHtcbiAgaWYgKGEgPT09IGdsb2JhbCkge1xuICAgIHJldHVybiBuZXcgRG9taW51cyhhKTtcbiAgfVxuICBpZiAoYSBpbnN0YW5jZW9mIERvbWludXMpIHtcbiAgICByZXR1cm4gYTtcbiAgfVxuICBpZiAoIWEpIHtcbiAgICByZXR1cm4gbmV3IERvbWludXMoKTtcbiAgfVxuICBpZiAodGVzdC5pc0VsZW1lbnQoYSkpIHtcbiAgICByZXR1cm4gbmV3IERvbWludXMoYSk7XG4gIH1cbiAgaWYgKCF0ZXN0LmlzQXJyYXkoYSkpIHtcbiAgICByZXR1cm4gbmV3IERvbWludXMoKTtcbiAgfVxuICByZXR1cm4gYXBwbHkoYSkuZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIHRlc3QuaXNFbGVtZW50KGkpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYXN0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xudmFyIHdoaXRlc3BhY2UgPSAvXFxzKy9nO1xudmFyIHRlc3QgPSByZXF1aXJlKCcuL3Rlc3QnKTtcblxuZnVuY3Rpb24gaW50ZXJwcmV0IChpbnB1dCkge1xuICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IGlucHV0LnJlcGxhY2UodHJpbSwgJycpLnNwbGl0KHdoaXRlc3BhY2UpIDogaW5wdXQ7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXMgKGVsKSB7XG4gIGlmICh0ZXN0LmlzRWxlbWVudChlbCkpIHtcbiAgICByZXR1cm4gZWwuY2xhc3NOYW1lLnJlcGxhY2UodHJpbSwgJycpLnNwbGl0KHdoaXRlc3BhY2UpO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gc2V0IChlbCwgaW5wdXQpIHtcbiAgaWYgKHRlc3QuaXNFbGVtZW50KGVsKSkge1xuICAgIGVsLmNsYXNzTmFtZSA9IGludGVycHJldChpbnB1dCkuam9pbignICcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZCAoZWwsIGlucHV0KSB7XG4gIHZhciBjdXJyZW50ID0gcmVtb3ZlKGVsLCBpbnB1dCk7XG4gIHZhciB2YWx1ZXMgPSBpbnRlcnByZXQoaW5wdXQpO1xuICBjdXJyZW50LnB1c2guYXBwbHkoY3VycmVudCwgdmFsdWVzKTtcbiAgc2V0KGVsLCBjdXJyZW50KTtcbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSAoZWwsIGlucHV0KSB7XG4gIHZhciBjdXJyZW50ID0gY2xhc3NlcyhlbCk7XG4gIHZhciB2YWx1ZXMgPSBpbnRlcnByZXQoaW5wdXQpO1xuICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgaSA9IGN1cnJlbnQuaW5kZXhPZih2YWx1ZSk7XG4gICAgaWYgKGkgIT09IC0xKSB7XG4gICAgICBjdXJyZW50LnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH0pO1xuICBzZXQoZWwsIGN1cnJlbnQpO1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gY29udGFpbnMgKGVsLCBpbnB1dCkge1xuICB2YXIgY3VycmVudCA9IGNsYXNzZXMoZWwpO1xuICB2YXIgdmFsdWVzID0gaW50ZXJwcmV0KGlucHV0KTtcblxuICByZXR1cm4gdmFsdWVzLmV2ZXJ5KGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBjdXJyZW50LmluZGV4T2YodmFsdWUpICE9PSAtMTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGQ6IGFkZCxcbiAgcmVtb3ZlOiByZW1vdmUsXG4gIGNvbnRhaW5zOiBjb250YWlucyxcbiAgc2V0OiBzZXQsXG4gIGdldDogY2xhc3Nlc1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhbmRsZXJzID0ge307XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyIChuYW1lLCB0eXBlLCBmaWx0ZXIpIHtcbiAgaGFuZGxlcnNbbmFtZV0gPSB7XG4gICAgZXZlbnQ6IHR5cGUsXG4gICAgZmlsdGVyOiBmaWx0ZXIsXG4gICAgd3JhcDogd3JhcFxuICB9O1xuXG4gIGZ1bmN0aW9uIHdyYXAgKGZuKSB7XG4gICAgcmV0dXJuIHdyYXBwZXIobmFtZSwgZm4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdyYXBwZXIgKG5hbWUsIGZuKSB7XG4gIGlmICghZm4pIHtcbiAgICByZXR1cm4gZm47XG4gIH1cbiAgdmFyIGtleSA9ICdfX2RjZV8nICsgbmFtZTtcbiAgaWYgKGZuW2tleV0pIHtcbiAgICByZXR1cm4gZm5ba2V5XTtcbiAgfVxuICBmbltrZXldID0gZnVuY3Rpb24gY3VzdG9tRXZlbnQgKGUpIHtcbiAgICB2YXIgbWF0Y2ggPSBoYW5kbGVyc1tuYW1lXS5maWx0ZXIoZSk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBmbltrZXldO1xufVxuXG5yZWdpc3RlcignbGVmdC1jbGljaycsICdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gIHJldHVybiBlLndoaWNoID09PSAxICYmICFlLm1ldGFLZXkgJiYgIWUuY3RybEtleTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcmVnaXN0ZXI6IHJlZ2lzdGVyLFxuICB3cmFwcGVyOiB3cmFwcGVyLFxuICBoYW5kbGVyczogaGFuZGxlcnNcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzZWt0b3IgPSByZXF1aXJlKCdzZWt0b3InKTtcbnZhciBjcm9zc3ZlbnQgPSByZXF1aXJlKCdjcm9zc3ZlbnQnKTtcbnZhciBEb21pbnVzID0gcmVxdWlyZSgnLi9Eb21pbnVzLmN0b3InKTtcbnZhciBjYXN0ID0gcmVxdWlyZSgnLi9jYXN0Jyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuL2FwcGx5Jyk7XG52YXIgdGV4dCA9IHJlcXVpcmUoJy4vdGV4dCcpO1xudmFyIHRlc3QgPSByZXF1aXJlKCcuL3Rlc3QnKTtcbnZhciBhcGkgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xudmFyIGRlbGVnYXRlcyA9IHt9O1xuXG5mdW5jdGlvbiBjYXN0Q29udGV4dCAoY29udGV4dCkge1xuICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGFwaS5xcyhudWxsLCBjb250ZXh0KTtcbiAgfVxuICBpZiAodGVzdC5pc0VsZW1lbnQoY29udGV4dCkpIHtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIERvbWludXMpIHtcbiAgICByZXR1cm4gY29udGV4dFswXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuYXBpLnFzYSA9IGZ1bmN0aW9uIChlbCwgc2VsZWN0b3IpIHtcbiAgdmFyIHJlc3VsdHMgPSBuZXcgRG9taW51cygpO1xuICByZXR1cm4gc2VrdG9yKHNlbGVjdG9yLCBjYXN0Q29udGV4dChlbCksIHJlc3VsdHMpO1xufTtcblxuYXBpLnFzID0gZnVuY3Rpb24gKGVsLCBzZWxlY3Rvcikge1xuICByZXR1cm4gYXBpLnFzYShlbCwgc2VsZWN0b3IpWzBdO1xufTtcblxuYXBpLm1hdGNoZXMgPSBmdW5jdGlvbiAoZWwsIHNlbGVjdG9yKSB7XG4gIHJldHVybiB0ZXN0LmlzRWxlbWVudChlbCkgJiYgc2VrdG9yLm1hdGNoZXNTZWxlY3RvcihlbCwgc2VsZWN0b3IpO1xufTtcblxuZnVuY3Rpb24gcmVsYXRlZEZhY3RvcnkgKHByb3ApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHJlbGF0ZWQgKGVsLCBzZWxlY3Rvcikge1xuICAgIHZhciByZWxhdGl2ZSA9IGVsW3Byb3BdO1xuICAgIGlmIChyZWxhdGl2ZSkge1xuICAgICAgaWYgKCFzZWxlY3RvciB8fCBhcGkubWF0Y2hlcyhyZWxhdGl2ZSwgc2VsZWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBjYXN0KHJlbGF0aXZlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEb21pbnVzKCk7XG4gIH07XG59XG5cbmFwaS5wcmV2ID0gcmVsYXRlZEZhY3RvcnkoJ3ByZXZpb3VzRWxlbWVudFNpYmxpbmcnKTtcbmFwaS5uZXh0ID0gcmVsYXRlZEZhY3RvcnkoJ25leHRFbGVtZW50U2libGluZycpO1xuYXBpLnBhcmVudCA9IHJlbGF0ZWRGYWN0b3J5KCdwYXJlbnRFbGVtZW50Jyk7XG5cbmZ1bmN0aW9uIG1hdGNoZXMgKGVsLCB2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG9taW51cykge1xuICAgIHJldHVybiB2YWx1ZS5pbmRleE9mKGVsKSAhPT0gLTE7XG4gIH1cbiAgaWYgKHRlc3QuaXNFbGVtZW50KHZhbHVlKSkge1xuICAgIHJldHVybiBlbCA9PT0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGFwaS5tYXRjaGVzKGVsLCB2YWx1ZSk7XG59XG5cbmFwaS5wYXJlbnRzID0gZnVuY3Rpb24gKGVsLCB2YWx1ZSkge1xuICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgdmFyIGN1cnJlbnQgPSBlbDtcbiAgd2hpbGUgKGN1cnJlbnQucGFyZW50RWxlbWVudCkge1xuICAgIGlmIChtYXRjaGVzKGN1cnJlbnQucGFyZW50RWxlbWVudCwgdmFsdWUpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGN1cnJlbnQucGFyZW50RWxlbWVudCk7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGFwcGx5KGVsZW1lbnRzKTtcbn07XG5cbmFwaS5jaGlsZHJlbiA9IGZ1bmN0aW9uIChlbCwgdmFsdWUpIHtcbiAgdmFyIGVsZW1lbnRzID0gW107XG4gIHZhciBjaGlsZHJlbiA9IGVsLmNoaWxkcmVuO1xuICB2YXIgY2hpbGQ7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBjaGlsZHJlbiAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGlmIChtYXRjaGVzKGNoaWxkLCB2YWx1ZSkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXBwbHkoZWxlbWVudHMpO1xufTtcblxuLy8gdGhpcyBtZXRob2QgY2FjaGVzIGRlbGVnYXRlcyBzbyB0aGF0IC5vZmYoKSB3b3JrcyBzZWFtbGVzc2x5XG5mdW5jdGlvbiBkZWxlZ2F0ZSAocm9vdCwgZmlsdGVyLCBmbikge1xuICBpZiAoZGVsZWdhdGVzW2ZuLl9kZF0pIHtcbiAgICByZXR1cm4gZGVsZWdhdGVzW2ZuLl9kZF07XG4gIH1cbiAgZm4uX2RkID0gRGF0ZS5ub3coKTtcbiAgZGVsZWdhdGVzW2ZuLl9kZF0gPSBkZWxlZ2F0b3I7XG4gIGZ1bmN0aW9uIGRlbGVnYXRvciAoZSkge1xuICAgIHZhciBlbCA9IGUudGFyZ2V0O1xuICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gcm9vdCkge1xuICAgICAgaWYgKGFwaS5tYXRjaGVzKGVsLCBmaWx0ZXIpKSB7XG4gICAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVsID0gZWwucGFyZW50RWxlbWVudDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlbGVnYXRvcjtcbn1cblxuZnVuY3Rpb24gZXZlbnRlZCAobWV0aG9kLCBlbCwgdHlwZSwgZmlsdGVyLCBmbikge1xuICBpZiAoZmlsdGVyID09PSBudWxsKSB7XG4gICAgY3Jvc3N2ZW50W21ldGhvZF0oZWwsIHR5cGUsIGZuKTtcbiAgfSBlbHNlIHtcbiAgICBjcm9zc3ZlbnRbbWV0aG9kXShlbCwgdHlwZSwgZGVsZWdhdGUoZWwsIGZpbHRlciwgZm4pKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbmNlIChlbCwgdHlwZSwgZmlsdGVyLCBmbikge1xuICB2YXIgdGhpbmdzID0gW2VsLCB0eXBlLCBmaWx0ZXIsIGRpc3Bvc2FibGVdO1xuICBhcGkub24uYXBwbHkoYXBpLCB0aGluZ3MpO1xuICBmdW5jdGlvbiBkaXNwb3NhYmxlICgpIHtcbiAgICBhcGkub2ZmLmFwcGx5KGFwaSwgdGhpbmdzKTtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5hcGkub25jZSA9IG9uY2U7XG5hcGkub24gPSBldmVudGVkLmJpbmQobnVsbCwgJ2FkZCcpO1xuYXBpLm9mZiA9IGV2ZW50ZWQuYmluZChudWxsLCAncmVtb3ZlJyk7XG5hcGkuZW1pdCA9IGV2ZW50ZWQuYmluZChudWxsLCAnZmFicmljYXRlJyk7XG5cbmFwaS5odG1sID0gZnVuY3Rpb24gKGVsZW0sIGh0bWwpIHtcbiAgdmFyIGdldHRlciA9IGFyZ3VtZW50cy5sZW5ndGggPCAyO1xuICBpZiAoZ2V0dGVyKSB7XG4gICAgcmV0dXJuIGVsZW0uaW5uZXJIVE1MO1xuICB9IGVsc2Uge1xuICAgIGVsZW0uaW5uZXJIVE1MID0gaHRtbDtcbiAgfVxufTtcblxuYXBpLnRleHQgPSBmdW5jdGlvbiAoZWxlbSwgdGV4dCkge1xuICB2YXIgY2hlY2thYmxlID0gdGVzdC5pc0NoZWNrYWJsZShlbGVtKTtcbiAgdmFyIGdldHRlciA9IGFyZ3VtZW50cy5sZW5ndGggPCAyO1xuICBpZiAoZ2V0dGVyKSB7XG4gICAgcmV0dXJuIGNoZWNrYWJsZSA/IGVsZW0udmFsdWUgOiBlbGVtLmlubmVyVGV4dCB8fCBlbGVtLnRleHRDb250ZW50O1xuICB9IGVsc2UgaWYgKGNoZWNrYWJsZSkge1xuICAgIGVsZW0udmFsdWUgPSB0ZXh0O1xuICB9IGVsc2Uge1xuICAgIGVsZW0uaW5uZXJUZXh0ID0gZWxlbS50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cbn07XG5cbmFwaS52YWx1ZSA9IGZ1bmN0aW9uIChlbCwgdmFsdWUpIHtcbiAgdmFyIGNoZWNrYWJsZSA9IHRlc3QuaXNDaGVja2FibGUoZWwpO1xuICB2YXIgZ2V0dGVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDI7XG4gIGlmIChnZXR0ZXIpIHtcbiAgICByZXR1cm4gY2hlY2thYmxlID8gZWwuY2hlY2tlZCA6IGVsLnZhbHVlO1xuICB9IGVsc2UgaWYgKGNoZWNrYWJsZSkge1xuICAgIGVsLmNoZWNrZWQgPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICBlbC52YWx1ZSA9IHZhbHVlO1xuICB9XG59O1xuXG5hcGkuYXR0ciA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsdWUpIHtcbiAgaWYgKCF0ZXN0LmlzRWxlbWVudChlbCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB2b2lkIDApIHtcbiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7IHJldHVybjtcbiAgfVxuICB2YXIgY2FtZWwgPSB0ZXh0Lmh5cGhlblRvQ2FtZWwobmFtZSk7XG4gIGlmIChjYW1lbCBpbiBlbCkge1xuICAgIGVsW2NhbWVsXSA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH1cbn07XG5cbmFwaS5nZXRBdHRyID0gZnVuY3Rpb24gKGVsLCBuYW1lKSB7XG4gIHZhciBjYW1lbCA9IHRleHQuaHlwaGVuVG9DYW1lbChuYW1lKTtcbiAgaWYgKGNhbWVsIGluIGVsKSB7XG4gICAgcmV0dXJuIGVsW2NhbWVsXTtcbiAgfSBlbHNlIGlmIChlbC5nZXRBdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuYXBpLm1hbnlBdHRyID0gZnVuY3Rpb24gKGVsZW0sIGF0dHJzKSB7XG4gIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgYXBpLmF0dHIoZWxlbSwgYXR0ciwgYXR0cnNbYXR0cl0pO1xuICB9KTtcbn07XG5cbmFwaS5tYWtlID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgcmV0dXJuIG5ldyBEb21pbnVzKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSkpO1xufTtcblxuYXBpLmNsb25lID0gZnVuY3Rpb24gKGVsKSB7XG4gIGlmIChlbC5jbG9uZU5vZGUpIHtcbiAgICByZXR1cm4gZWwuY2xvbmVOb2RlKHRydWUpO1xuICB9XG4gIHJldHVybiBlbDtcbn07XG5cbmFwaS5yZW1vdmUgPSBmdW5jdGlvbiAoZWwpIHtcbiAgaWYgKGVsLnBhcmVudEVsZW1lbnQpIHtcbiAgICBlbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGVsKTtcbiAgfVxufTtcblxuYXBpLmFwcGVuZCA9IGZ1bmN0aW9uIChlbCwgdGFyZ2V0KSB7XG4gIGlmIChtYW5pcHVsYXRpb25HdWFyZChlbCwgdGFyZ2V0LCBhcGkuYXBwZW5kKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZWwuYXBwZW5kQ2hpbGQpIHtcbiAgICBlbC5hcHBlbmRDaGlsZCh0YXJnZXQpO1xuICB9XG59O1xuXG5hcGkucHJlcGVuZCA9IGZ1bmN0aW9uIChlbCwgdGFyZ2V0KSB7XG4gIGlmIChtYW5pcHVsYXRpb25HdWFyZChlbCwgdGFyZ2V0LCBhcGkucHJlcGVuZCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsLmluc2VydEJlZm9yZSkge1xuICAgIGVsLmluc2VydEJlZm9yZSh0YXJnZXQsIGVsLmZpcnN0Q2hpbGQpO1xuICB9XG59O1xuXG5hcGkuYmVmb3JlID0gZnVuY3Rpb24gKGVsLCB0YXJnZXQpIHtcbiAgaWYgKG1hbmlwdWxhdGlvbkd1YXJkKGVsLCB0YXJnZXQsIGFwaS5iZWZvcmUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGFyZ2V0LCBlbCk7XG4gIH1cbn07XG5cbmFwaS5hZnRlciA9IGZ1bmN0aW9uIChlbCwgdGFyZ2V0KSB7XG4gIGlmIChtYW5pcHVsYXRpb25HdWFyZChlbCwgdGFyZ2V0LCBhcGkuYWZ0ZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGFyZ2V0LCBlbC5uZXh0U2libGluZyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIG1hbmlwdWxhdGlvbkd1YXJkIChlbCwgdGFyZ2V0LCBmbikge1xuICB2YXIgcmlnaHQgPSB0YXJnZXQgaW5zdGFuY2VvZiBEb21pbnVzO1xuICB2YXIgbGVmdCA9IGVsIGluc3RhbmNlb2YgRG9taW51cztcbiAgaWYgKGxlZnQpIHtcbiAgICBlbC5mb3JFYWNoKG1hbmlwdWxhdGVNYW55KTtcbiAgfSBlbHNlIGlmIChyaWdodCkge1xuICAgIG1hbmlwdWxhdGUoZWwsIHRydWUpO1xuICB9XG4gIHJldHVybiAhZWwgfHwgIXRhcmdldCB8fCBsZWZ0IHx8IHJpZ2h0O1xuXG4gIGZ1bmN0aW9uIG1hbmlwdWxhdGUgKGVsLCBwcmVjb25kaXRpb24pIHtcbiAgICBpZiAocmlnaHQpIHtcbiAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQsIGopIHtcbiAgICAgICAgZm4oZWwsIGNsb25lVW5sZXNzKHRhcmdldCwgcHJlY29uZGl0aW9uICYmIGogPT09IDApKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbihlbCwgY2xvbmVVbmxlc3ModGFyZ2V0LCBwcmVjb25kaXRpb24pKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYW5pcHVsYXRlTWFueSAoZWwsIGkpIHtcbiAgICBtYW5pcHVsYXRlKGVsLCBpID09PSAwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzcyAodGFyZ2V0LCBjb25kaXRpb24pIHtcbiAgcmV0dXJuIGNvbmRpdGlvbiA/IHRhcmdldCA6IGFwaS5jbG9uZSh0YXJnZXQpO1xufVxuXG5bJ2FwcGVuZFRvJywgJ3ByZXBlbmRUbycsICdiZWZvcmVPZicsICdhZnRlck9mJ10uZm9yRWFjaChmbGlwKTtcblxuZnVuY3Rpb24gZmxpcCAoa2V5KSB7XG4gIHZhciBvcmlnaW5hbCA9IGtleS5zcGxpdCgvW0EtWl0vKVswXTtcbiAgYXBpW2tleV0gPSBmdW5jdGlvbiAoZWwsIHRhcmdldCkge1xuICAgIGFwaVtvcmlnaW5hbF0odGFyZ2V0LCBlbCk7XG4gIH07XG59XG5cbnZhciBudW1lcmljQ3NzUHJvcGVydGllcyA9IHtcbiAgJ2NvbHVtbi1jb3VudCc6IHRydWUsXG4gICdmaWxsLW9wYWNpdHknOiB0cnVlLFxuICAnZmxleC1ncm93JzogdHJ1ZSxcbiAgJ2ZsZXgtc2hyaW5rJzogdHJ1ZSxcbiAgJ2ZvbnQtd2VpZ2h0JzogdHJ1ZSxcbiAgJ2xpbmUtaGVpZ2h0JzogdHJ1ZSxcbiAgJ29wYWNpdHknOiB0cnVlLFxuICAnb3JkZXInOiB0cnVlLFxuICAnb3JwaGFucyc6IHRydWUsXG4gICd3aWRvd3MnOiB0cnVlLFxuICAnei1pbmRleCc6IHRydWUsXG4gICd6b29tJzogdHJ1ZVxufTtcbnZhciBudW1lcmljID0gL15cXGQrJC87XG52YXIgY2FuRmxvYXQgPSAnZmxvYXQnIGluIGRvY3VtZW50LmJvZHkuc3R5bGU7XG5cbmFwaS5nZXRDc3MgPSBmdW5jdGlvbiAoZWwsIHByb3ApIHtcbiAgaWYgKCF0ZXN0LmlzRWxlbWVudChlbCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgaHByb3AgPSB0ZXh0Lmh5cGhlbmF0ZShwcm9wKTtcbiAgdmFyIGZwcm9wID0gIWNhbkZsb2F0ICYmIGhwcm9wID09PSAnZmxvYXQnID8gJ2Nzc0Zsb2F0JyA6IGhwcm9wO1xuICB2YXIgcmVzdWx0ID0gZ2xvYmFsLmdldENvbXB1dGVkU3R5bGUoZWwpW2hwcm9wXTtcbiAgaWYgKHByb3AgPT09ICdvcGFjaXR5JyAmJiByZXN1bHQgPT09ICcnKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgaWYgKHJlc3VsdC5zdWJzdHIoLTIpID09PSAncHgnIHx8IG51bWVyaWMudGVzdChyZXN1bHQpKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0LCAxMCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmFwaS5zZXRDc3MgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIG1hcHBlZCA9IE9iamVjdC5rZXlzKHByb3BzKS5maWx0ZXIoYmFkKS5tYXAoZXhwYW5kKTtcbiAgZnVuY3Rpb24gYmFkIChwcm9wKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvcHNbcHJvcF07XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlID09PSB2YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiBleHBhbmQgKHByb3ApIHtcbiAgICB2YXIgaHByb3AgPSB0ZXh0Lmh5cGhlbmF0ZShwcm9wKTtcbiAgICB2YXIgdmFsdWUgPSBwcm9wc1twcm9wXTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhbnVtZXJpY0Nzc1Byb3BlcnRpZXNbaHByb3BdKSB7XG4gICAgICB2YWx1ZSArPSAncHgnO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogaHByb3AsIHZhbHVlOiB2YWx1ZVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbCkge1xuICAgIGlmICghdGVzdC5pc0VsZW1lbnQoZWwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1hcHBlZC5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICBlbC5zdHlsZVtwcm9wLm5hbWVdID0gcHJvcC52YWx1ZTtcbiAgICB9KTtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9Eb21pbnVzLnByb3RvdHlwZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRG9taW51cyA9IHJlcXVpcmUoJy4vRG9taW51cy5jdG9yJyk7XG5cbmZ1bmN0aW9uIGZsYXR0ZW4gKGEsIGNhY2hlKSB7XG4gIHJldHVybiBhLnJlZHVjZShmdW5jdGlvbiAoY3VycmVudCwgaXRlbSkge1xuICAgIGlmIChEb21pbnVzLmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgIHJldHVybiBmbGF0dGVuKGl0ZW0sIGN1cnJlbnQpO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudC5pbmRleE9mKGl0ZW0pID09PSAtMSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQuY29uY2F0KGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfSwgY2FjaGUgfHwgbmV3IERvbWludXMoKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRvbSA9IHJlcXVpcmUoJy4vZG9tJyk7XG52YXIgY2FzdCA9IHJlcXVpcmUoJy4vY2FzdCcpO1xudmFyIGN1c3RvbSA9IHJlcXVpcmUoJy4vY3VzdG9tJyk7XG52YXIgRG9taW51cyA9IHJlcXVpcmUoJy4vRG9taW51cy5jdG9yJyk7XG52YXIgdGFnID0gL15cXHMqPChbYS16XSsoPzotW2Etel0rKT8pXFxzKlxcLz8+XFxzKiQvaTtcblxuZnVuY3Rpb24gYXBpIChzZWxlY3RvciwgY29udGV4dCkge1xuICB2YXIgbm90VGV4dCA9IHR5cGVvZiBzZWxlY3RvciAhPT0gJ3N0cmluZyc7XG4gIGlmIChub3RUZXh0ICYmIGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIGNhc3Qoc2VsZWN0b3IpO1xuICB9XG4gIGlmIChub3RUZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBEb21pbnVzKCk7XG4gIH1cbiAgdmFyIG1hdGNoZXMgPSBzZWxlY3Rvci5tYXRjaCh0YWcpO1xuICBpZiAobWF0Y2hlcykge1xuICAgIHJldHVybiBkb20ubWFrZShtYXRjaGVzWzFdKTtcbiAgfVxuICByZXR1cm4gYXBpLmZpbmQoc2VsZWN0b3IsIGNvbnRleHQpO1xufVxuXG5hcGkuZmluZCA9IGZ1bmN0aW9uIChzZWxlY3RvciwgY29udGV4dCkge1xuICByZXR1cm4gZG9tLnFzYShjb250ZXh0LCBzZWxlY3Rvcik7XG59O1xuXG5hcGkuZmluZE9uZSA9IGZ1bmN0aW9uIChzZWxlY3RvciwgY29udGV4dCkge1xuICByZXR1cm4gZG9tLnFzKGNvbnRleHQsIHNlbGVjdG9yKTtcbn07XG5cbmFwaS5jdXN0b20gPSBjdXN0b20ucmVnaXN0ZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gYXBpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZWxlbWVudE9iamVjdHMgPSB0eXBlb2YgSFRNTEVsZW1lbnQgPT09ICdvYmplY3QnO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQgKG8pIHtcbiAgcmV0dXJuIGVsZW1lbnRPYmplY3RzID8gbyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IDogaXNFbGVtZW50T2JqZWN0KG8pO1xufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnRPYmplY3QgKG8pIHtcbiAgcmV0dXJuIG8gJiZcbiAgICB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2Ygby5ub2RlTmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICBvLm5vZGVUeXBlID09PSAxO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5IChhKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2thYmxlIChlbGVtKSB7XG4gIHJldHVybiAnY2hlY2tlZCcgaW4gZWxlbSAmJiBlbGVtLnR5cGUgPT09ICdyYWRpbycgfHwgZWxlbS50eXBlID09PSAnY2hlY2tib3gnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNFbGVtZW50OiBpc0VsZW1lbnQsXG4gIGlzQXJyYXk6IGlzQXJyYXksXG4gIGlzQ2hlY2thYmxlOiBpc0NoZWNrYWJsZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gaHlwaGVuVG9DYW1lbCAoaHlwaGVucykge1xuICB2YXIgcGFydCA9IC8tKFthLXpdKS9nO1xuICByZXR1cm4gaHlwaGVucy5yZXBsYWNlKHBhcnQsIGZ1bmN0aW9uIChnLCBtKSB7XG4gICAgcmV0dXJuIG0udG9VcHBlckNhc2UoKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGh5cGhlbmF0ZSAodGV4dCkge1xuICB2YXIgY2FtZWwgPSAvKFthLXpdKShbQS1aXSkvZztcbiAgcmV0dXJuIHRleHQucmVwbGFjZShjYW1lbCwgJyQxLSQyJykudG9Mb3dlckNhc2UoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGh5cGhlblRvQ2FtZWw6IGh5cGhlblRvQ2FtZWwsXG4gIGh5cGhlbmF0ZTogaHlwaGVuYXRlXG59O1xuIl19 1144 | -------------------------------------------------------------------------------- /dist/dominus.min.js: -------------------------------------------------------------------------------- 1 | !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.dominus=t()}}(function(){return function t(e,n,r){function o(u,c){if(!n[u]){if(!e[u]){var f="function"==typeof require&&require;if(!c&&f)return f(u,!0);if(i)return i(u,!0);var a=new Error("Cannot find module '"+u+"'");throw a.code="MODULE_NOT_FOUND",a}var s=n[u]={exports:{}};e[u][0].call(s.exports,function(t){var n=e[u][1][t];return o(n?n:t)},s,s.exports,t,e,n,r)}return n[u].exports}for(var i="function"==typeof require&&require,u=0;u1;return u?(this.forEach(i),this):this.length?d.getAttr(this[0],t):null},["html","text","value"].forEach(s),y.prototype.clone=function(){return this.map(function(t){return d.clone(t)})},y.prototype.focus=function(){return this.length&&this[0].focus(),this},e.exports=t("./public")},{"./Dominus.ctor":7,"./apply":9,"./classes":11,"./custom":12,"./dom":13,"./flatten":15,"./public":16}],9:[function(t,e,n){"use strict";function r(t){return u.apply(this,t)}function o(t){return new r(t)}function i(t){var e=c[t];c[t]=function(){return o(e.apply(this,arguments))}}var u=t("./Dominus.ctor"),c=u.prototype;r.prototype=c,["map","filter","concat","slice"].forEach(i),e.exports=o},{"./Dominus.ctor":7}],10:[function(t,e,n){(function(n){"use strict";function r(t){return t===n?new u(t):t instanceof u?t:t?o.isElement(t)?new u(t):o.isArray(t)?i(t).filter(function(t){return o.isElement(t)}):new u:new u}var o=t("./test"),i=t("./apply"),u=t("./Dominus.ctor");e.exports=r}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./Dominus.ctor":7,"./apply":9,"./test":17}],11:[function(t,e,n){"use strict";function r(t){return"string"==typeof t?t.replace(a,"").split(s):t}function o(t){return l.isElement(t)?t.className.replace(a,"").split(s):[]}function i(t,e){l.isElement(t)&&(t.className=r(e).join(" "))}function u(t,e){var n=c(t,e),o=r(e);return n.push.apply(n,o),i(t,n),n}function c(t,e){var n=o(t),u=r(e);return u.forEach(function(t){var e=n.indexOf(t);-1!==e&&n.splice(e,1)}),i(t,n),n}function f(t,e){var n=o(t),i=r(e);return i.every(function(t){return-1!==n.indexOf(t)})}var a=/^\s+|\s+$/g,s=/\s+/g,l=t("./test");e.exports={add:u,remove:c,contains:f,set:i,get:o}},{"./test":17}],12:[function(t,e,n){"use strict";function r(t,e,n){function r(e){return o(t,e)}i[t]={event:e,filter:n,wrap:r}}function o(t,e){if(!e)return e;var n="__dce_"+t;return e[n]?e[n]:(e[n]=function(n){var r=i[t].filter(n);return r?e.apply(this,arguments):void 0},e[n])}var i={};r("left-click","click",function(t){return 1===t.which&&!t.metaKey&&!t.ctrlKey}),e.exports={register:r,wrapper:o,handlers:i}},{}],13:[function(t,e,n){(function(n){"use strict";function r(t){return"string"==typeof t?g.qs(null,t):b.isElement(t)?t:t instanceof h?t[0]:null}function o(t){return function(e,n){var r=e[t];return!r||n&&!g.matches(r,n)?new h:m(r)}}function i(t,e){return e?e instanceof h?-1!==e.indexOf(t):b.isElement(e)?t===e:g.matches(t,e):!0}function u(t,e,n){function r(r){for(var o=r.target;o&&o!==t;){if(g.matches(o,e))return void n.apply(this,arguments);o=o.parentElement}}return E[n._dd]?E[n._dd]:(n._dd=Date.now(),E[n._dd]=r,r)}function c(t,e,n,r,o){null===r?d[t](e,n,o):d[t](e,n,u(e,r,o))}function f(t,e,n,r){function o(){return g.off.apply(g,i),r.apply(this,arguments)}var i=[t,e,n,o];g.on.apply(g,i)}function a(t,e,n){function r(t,r){i?e.forEach(function(e,o){n(t,s(e,r&&0===o))}):n(t,s(e,r))}function o(t,e){r(t,0===e)}var i=e instanceof h,u=t instanceof h;return u?t.forEach(o):i&&r(t,!0),!t||!e||u||i}function s(t,e){return e?t:g.clone(t)}function l(t){var e=t.split(/[A-Z]/)[0];g[t]=function(t,n){g[e](n,t)}}var p=t("sektor"),d=t("crossvent"),h=t("./Dominus.ctor"),m=t("./cast"),v=t("./apply"),y=t("./text"),b=t("./test"),g=e.exports={},E={};g.qsa=function(t,e){var n=new h;return p(e,r(t),n)},g.qs=function(t,e){return g.qsa(t,e)[0]},g.matches=function(t,e){return b.isElement(t)&&p.matchesSelector(t,e)},g.prev=o("previousElementSibling"),g.next=o("nextElementSibling"),g.parent=o("parentElement"),g.parents=function(t,e){for(var n=[],r=t;r.parentElement;)i(r.parentElement,e)&&n.push(r.parentElement),r=r.parentElement;return v(n)},g.children=function(t,e){var n,r,o=[],u=t.children;for(r=0;u&&r\s*$/i;r.find=function(t,e){return o.qsa(e,t)},r.findOne=function(t,e){return o.qs(e,t)},r.custom=u.register,e.exports=r},{"./Dominus.ctor":7,"./cast":10,"./custom":12,"./dom":13}],17:[function(t,e,n){"use strict";function r(t){return c?t instanceof HTMLElement:o(t)}function o(t){return t&&"object"==typeof t&&"string"==typeof t.nodeName&&1===t.nodeType}function i(t){return"[object Array]"===Object.prototype.toString.call(t)}function u(t){return"checked"in t&&"radio"===t.type||"checkbox"===t.type}var c="object"==typeof HTMLElement;e.exports={isElement:r,isArray:i,isCheckable:u}},{}],18:[function(t,e,n){"use strict";function r(t){var e=/-([a-z])/g;return t.replace(e,function(t,e){return e.toUpperCase()})}function o(t){var e=/([a-z])([A-Z])/g;return t.replace(e,"$1-$2").toLowerCase()}e.exports={hyphenToCamel:r,hyphenate:o}},{}]},{},[14])(14)}); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dominus", 3 | "description": "Lean DOM Manipulation", 4 | "version": "6.0.2", 5 | "homepage": "https://github.com/bevacqua/dominus", 6 | "author": { 7 | "email": "ng@bevacqua.io", 8 | "name": "Nicolas Bevacqua", 9 | "url": "http://bevacqua.io" 10 | }, 11 | "license": "MIT", 12 | "repository": { 13 | "type": "git", 14 | "url": "git://github.com/bevacqua/dominus.git" 15 | }, 16 | "main": "src/null.js", 17 | "browser": "src/dominus.js", 18 | "scripts": { 19 | "build": "jshint . && browserify -s dominus -do dist/dominus.js src/dominus.js && uglifyjs -m -c -o dist/dominus.min.js dist/dominus.js", 20 | "deploy": "npm run build && npm run deployment", 21 | "deployment": "git add dist && npm version ${BUMP:-\"patch\"} --no-git-tag-version && git add package.json && git commit -am \"Autogenerated pre-deployment commit\" && bower version ${BUMP:-\"patch\"} && git reset HEAD~2 && git add . && git commit -am \"Release $(cat package.json | jq -r .version)\" && git push --tags && npm publish && git push" 22 | }, 23 | "devDependencies": { 24 | "browserify": "11.0.1", 25 | "jshint": "2.8.0", 26 | "uglify-js": "2.4.24" 27 | }, 28 | "dependencies": { 29 | "crossvent": "1.5.4", 30 | "poser": "1.2.0", 31 | "sektor": "1.1.5" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /resources/dominus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bevacqua/dominus/6a132b1da2a393d1d7c52c2e37a273e641f157a4/resources/dominus.png -------------------------------------------------------------------------------- /src/Dominus.ctor.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var poser = require('poser'); 4 | var Dominus = poser.Array(); 5 | 6 | module.exports = Dominus; 7 | -------------------------------------------------------------------------------- /src/Dominus.prototype.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var $ = require('./public'); 4 | var flatten = require('./flatten'); 5 | var dom = require('./dom'); 6 | var apply = require('./apply'); 7 | var custom = require('./custom'); 8 | var classes = require('./classes'); 9 | var Dominus = require('./Dominus.ctor'); 10 | 11 | function equals (selector) { 12 | return function equals (elem) { 13 | return dom.matches(elem, selector); 14 | }; 15 | } 16 | 17 | function straight (prop, one) { 18 | return function domMapping (selector) { 19 | var result = this.map(function (elem) { 20 | return dom[prop](elem, selector); 21 | }); 22 | var results = flatten(result); 23 | return one ? results[0] : results; 24 | }; 25 | } 26 | 27 | Dominus.prototype.prev = straight('prev'); 28 | Dominus.prototype.next = straight('next'); 29 | Dominus.prototype.parent = straight('parent'); 30 | Dominus.prototype.parents = straight('parents'); 31 | Dominus.prototype.children = straight('children'); 32 | Dominus.prototype.find = straight('qsa'); 33 | Dominus.prototype.findOne = straight('qs', true); 34 | 35 | Dominus.prototype.where = function (selector) { 36 | return this.filter(equals(selector)); 37 | }; 38 | 39 | Dominus.prototype.is = function (selector) { 40 | return this.some(equals(selector)); 41 | }; 42 | 43 | Dominus.prototype.i = function (index) { 44 | return this[index] ? new Dominus(this[index]) : new Dominus(); 45 | }; 46 | 47 | function compareFactory (fn) { 48 | return function compare () { 49 | var copy = apply(this); 50 | $.apply(null, arguments).forEach(fn, copy); 51 | return copy; 52 | }; 53 | } 54 | 55 | Dominus.prototype.and = compareFactory(function addOne (elem) { 56 | if (this.indexOf(elem) === -1) { 57 | this.push(elem); 58 | } 59 | return this; 60 | }); 61 | 62 | Dominus.prototype.but = compareFactory(function addOne (elem) { 63 | var index = this.indexOf(elem); 64 | if (index !== -1) { 65 | this.splice(index, 1); 66 | } 67 | return this; 68 | }); 69 | 70 | Dominus.prototype.css = function (name, value) { 71 | var props; 72 | var many = name && typeof name === 'object'; 73 | var getter = !many && !value; 74 | if (getter) { 75 | return this.length ? dom.getCss(this[0], name) : null; 76 | } 77 | if (many) { 78 | props = name; 79 | } else { 80 | props = {}; 81 | props[name] = value; 82 | } 83 | this.forEach(dom.setCss(props)); 84 | return this; 85 | }; 86 | 87 | function eventer (method) { 88 | return function (types, filter, fn) { 89 | var typelist = types.split(' '); 90 | if (typeof fn !== 'function') { 91 | fn = filter; 92 | filter = null; 93 | } 94 | this.forEach(function (elem) { 95 | typelist.forEach(function (type) { 96 | var handler = custom.handlers[type]; 97 | if (handler) { 98 | dom[method](elem, handler.event, filter, handler.wrap(fn)); 99 | } else { 100 | dom[method](elem, type, filter, fn); 101 | } 102 | }); 103 | }); 104 | return this; 105 | }; 106 | } 107 | 108 | Dominus.prototype.once = eventer('once'); 109 | Dominus.prototype.on = eventer('on'); 110 | Dominus.prototype.off = eventer('off'); 111 | Dominus.prototype.emit = eventer('emit'); 112 | 113 | [ 114 | ['addClass', classes.add], 115 | ['removeClass', classes.remove], 116 | ['setClass', classes.set], 117 | ['removeClass', classes.remove], 118 | ['remove', dom.remove] 119 | ].forEach(mapMethods); 120 | 121 | function mapMethods (data) { 122 | Dominus.prototype[data[0]] = function (value) { 123 | this.forEach(function (elem) { 124 | data[1](elem, value); 125 | }); 126 | return this; 127 | }; 128 | } 129 | 130 | [ 131 | 'append', 132 | 'appendTo', 133 | 'prepend', 134 | 'prependTo', 135 | 'before', 136 | 'beforeOf', 137 | 'after', 138 | 'afterOf' 139 | ].forEach(mapManipulation); 140 | 141 | function mapManipulation (method) { 142 | Dominus.prototype[method] = function (value) { 143 | dom[method](this, value); 144 | return this; 145 | }; 146 | } 147 | 148 | Dominus.prototype.hasClass = function (value) { 149 | return this.some(function (elem) { 150 | return classes.contains(elem, value); 151 | }); 152 | }; 153 | 154 | Dominus.prototype.attr = function (name, value) { 155 | var hash = name && typeof name === 'object'; 156 | var set = hash ? setMany : setSingle; 157 | var setter = hash || arguments.length > 1; 158 | if (setter) { 159 | this.forEach(set); 160 | return this; 161 | } else { 162 | return this.length ? dom.getAttr(this[0], name) : null; 163 | } 164 | function setMany (elem) { 165 | dom.manyAttr(elem, name); 166 | } 167 | function setSingle (elem) { 168 | dom.attr(elem, name, value); 169 | } 170 | }; 171 | 172 | function keyValue (key, value) { 173 | var getter = arguments.length < 2; 174 | if (getter) { 175 | return this.length ? dom[key](this[0]) : ''; 176 | } 177 | this.forEach(function (elem) { 178 | dom[key](elem, value); 179 | }); 180 | return this; 181 | } 182 | 183 | function keyValueProperty (prop) { 184 | Dominus.prototype[prop] = function accessor (value) { 185 | var getter = arguments.length < 1; 186 | if (getter) { 187 | return keyValue.call(this, prop); 188 | } 189 | return keyValue.call(this, prop, value); 190 | }; 191 | } 192 | 193 | ['html', 'text', 'value'].forEach(keyValueProperty); 194 | 195 | Dominus.prototype.clone = function () { 196 | return this.map(function (elem) { 197 | return dom.clone(elem); 198 | }); 199 | }; 200 | 201 | Dominus.prototype.focus = function () { 202 | if (this.length) { 203 | this[0].focus(); 204 | } 205 | return this; 206 | }; 207 | 208 | module.exports = require('./public'); 209 | -------------------------------------------------------------------------------- /src/apply.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Dominus = require('./Dominus.ctor'); 4 | var proto = Dominus.prototype; 5 | 6 | function Applied (args) { 7 | return Dominus.apply(this, args); 8 | } 9 | 10 | Applied.prototype = proto; 11 | 12 | function apply (a) { 13 | return new Applied(a); 14 | } 15 | 16 | ['map', 'filter', 'concat', 'slice'].forEach(ensure); 17 | 18 | function ensure (key) { 19 | var original = proto[key]; 20 | proto[key] = function applied () { 21 | return apply(original.apply(this, arguments)); 22 | }; 23 | } 24 | 25 | module.exports = apply; 26 | -------------------------------------------------------------------------------- /src/cast.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var test = require('./test'); 4 | var apply = require('./apply'); 5 | var Dominus = require('./Dominus.ctor'); 6 | 7 | function cast (a) { 8 | if (a === global) { 9 | return new Dominus(a); 10 | } 11 | if (a instanceof Dominus) { 12 | return a; 13 | } 14 | if (!a) { 15 | return new Dominus(); 16 | } 17 | if (test.isElement(a)) { 18 | return new Dominus(a); 19 | } 20 | if (!test.isArray(a)) { 21 | return new Dominus(); 22 | } 23 | return apply(a).filter(function (i) { 24 | return test.isElement(i); 25 | }); 26 | } 27 | 28 | module.exports = cast; 29 | -------------------------------------------------------------------------------- /src/classes.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var trim = /^\s+|\s+$/g; 4 | var whitespace = /\s+/g; 5 | var test = require('./test'); 6 | 7 | function interpret (input) { 8 | return typeof input === 'string' ? input.replace(trim, '').split(whitespace) : input; 9 | } 10 | 11 | function classes (el) { 12 | if (test.isElement(el)) { 13 | return el.className.replace(trim, '').split(whitespace); 14 | } 15 | return []; 16 | } 17 | 18 | function set (el, input) { 19 | if (test.isElement(el)) { 20 | el.className = interpret(input).join(' '); 21 | } 22 | } 23 | 24 | function add (el, input) { 25 | var current = remove(el, input); 26 | var values = interpret(input); 27 | current.push.apply(current, values); 28 | set(el, current); 29 | return current; 30 | } 31 | 32 | function remove (el, input) { 33 | var current = classes(el); 34 | var values = interpret(input); 35 | values.forEach(function (value) { 36 | var i = current.indexOf(value); 37 | if (i !== -1) { 38 | current.splice(i, 1); 39 | } 40 | }); 41 | set(el, current); 42 | return current; 43 | } 44 | 45 | function contains (el, input) { 46 | var current = classes(el); 47 | var values = interpret(input); 48 | 49 | return values.every(function (value) { 50 | return current.indexOf(value) !== -1; 51 | }); 52 | } 53 | 54 | module.exports = { 55 | add: add, 56 | remove: remove, 57 | contains: contains, 58 | set: set, 59 | get: classes 60 | }; 61 | -------------------------------------------------------------------------------- /src/custom.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var handlers = {}; 4 | 5 | function register (name, type, filter) { 6 | handlers[name] = { 7 | event: type, 8 | filter: filter, 9 | wrap: wrap 10 | }; 11 | 12 | function wrap (fn) { 13 | return wrapper(name, fn); 14 | } 15 | } 16 | 17 | function wrapper (name, fn) { 18 | if (!fn) { 19 | return fn; 20 | } 21 | var key = '__dce_' + name; 22 | if (fn[key]) { 23 | return fn[key]; 24 | } 25 | fn[key] = function customEvent (e) { 26 | var match = handlers[name].filter(e); 27 | if (match) { 28 | return fn.apply(this, arguments); 29 | } 30 | }; 31 | return fn[key]; 32 | } 33 | 34 | register('left-click', 'click', function (e) { 35 | return e.which === 1 && !e.metaKey && !e.ctrlKey; 36 | }); 37 | 38 | module.exports = { 39 | register: register, 40 | wrapper: wrapper, 41 | handlers: handlers 42 | }; 43 | -------------------------------------------------------------------------------- /src/dom.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var sektor = require('sektor'); 4 | var crossvent = require('crossvent'); 5 | var Dominus = require('./Dominus.ctor'); 6 | var cast = require('./cast'); 7 | var apply = require('./apply'); 8 | var text = require('./text'); 9 | var test = require('./test'); 10 | var api = module.exports = {}; 11 | var delegates = {}; 12 | 13 | function castContext (context) { 14 | if (typeof context === 'string') { 15 | return api.qs(null, context); 16 | } 17 | if (test.isElement(context)) { 18 | return context; 19 | } 20 | if (context instanceof Dominus) { 21 | return context[0]; 22 | } 23 | return null; 24 | } 25 | 26 | api.qsa = function (el, selector) { 27 | var results = new Dominus(); 28 | return sektor(selector, castContext(el), results); 29 | }; 30 | 31 | api.qs = function (el, selector) { 32 | return api.qsa(el, selector)[0]; 33 | }; 34 | 35 | api.matches = function (el, selector) { 36 | return test.isElement(el) && sektor.matchesSelector(el, selector); 37 | }; 38 | 39 | function relatedFactory (prop) { 40 | return function related (el, selector) { 41 | var relative = el[prop]; 42 | if (relative) { 43 | if (!selector || api.matches(relative, selector)) { 44 | return cast(relative); 45 | } 46 | } 47 | return new Dominus(); 48 | }; 49 | } 50 | 51 | api.prev = relatedFactory('previousElementSibling'); 52 | api.next = relatedFactory('nextElementSibling'); 53 | api.parent = relatedFactory('parentElement'); 54 | 55 | function matches (el, value) { 56 | if (!value) { 57 | return true; 58 | } 59 | if (value instanceof Dominus) { 60 | return value.indexOf(el) !== -1; 61 | } 62 | if (test.isElement(value)) { 63 | return el === value; 64 | } 65 | return api.matches(el, value); 66 | } 67 | 68 | api.parents = function (el, value) { 69 | var elements = []; 70 | var current = el; 71 | while (current.parentElement) { 72 | if (matches(current.parentElement, value)) { 73 | elements.push(current.parentElement); 74 | } 75 | current = current.parentElement; 76 | } 77 | return apply(elements); 78 | }; 79 | 80 | api.children = function (el, value) { 81 | var elements = []; 82 | var children = el.children; 83 | var child; 84 | var i; 85 | for (i = 0; children && i < children.length; i++) { 86 | child = children[i]; 87 | if (matches(child, value)) { 88 | elements.push(child); 89 | } 90 | } 91 | return apply(elements); 92 | }; 93 | 94 | // this method caches delegates so that .off() works seamlessly 95 | function delegate (root, filter, fn) { 96 | if (delegates[fn._dd]) { 97 | return delegates[fn._dd]; 98 | } 99 | fn._dd = Date.now(); 100 | delegates[fn._dd] = delegator; 101 | function delegator (e) { 102 | var el = e.target; 103 | while (el && el !== root) { 104 | if (api.matches(el, filter)) { 105 | fn.apply(this, arguments); return; 106 | } 107 | el = el.parentElement; 108 | } 109 | } 110 | return delegator; 111 | } 112 | 113 | function evented (method, el, type, filter, fn) { 114 | if (filter === null) { 115 | crossvent[method](el, type, fn); 116 | } else { 117 | crossvent[method](el, type, delegate(el, filter, fn)); 118 | } 119 | } 120 | 121 | function once (el, type, filter, fn) { 122 | var things = [el, type, filter, disposable]; 123 | api.on.apply(api, things); 124 | function disposable () { 125 | api.off.apply(api, things); 126 | return fn.apply(this, arguments); 127 | } 128 | } 129 | 130 | api.once = once; 131 | api.on = evented.bind(null, 'add'); 132 | api.off = evented.bind(null, 'remove'); 133 | api.emit = evented.bind(null, 'fabricate'); 134 | 135 | api.html = function (elem, html) { 136 | var getter = arguments.length < 2; 137 | if (getter) { 138 | return elem.innerHTML; 139 | } else { 140 | elem.innerHTML = html; 141 | } 142 | }; 143 | 144 | api.text = function (elem, text) { 145 | var checkable = test.isCheckable(elem); 146 | var getter = arguments.length < 2; 147 | if (getter) { 148 | return checkable ? elem.value : elem.innerText || elem.textContent; 149 | } else if (checkable) { 150 | elem.value = text; 151 | } else { 152 | elem.innerText = elem.textContent = text; 153 | } 154 | }; 155 | 156 | api.value = function (el, value) { 157 | var checkable = test.isCheckable(el); 158 | var getter = arguments.length < 2; 159 | if (getter) { 160 | return checkable ? el.checked : el.value; 161 | } else if (checkable) { 162 | el.checked = value; 163 | } else { 164 | el.value = value; 165 | } 166 | }; 167 | 168 | api.attr = function (el, name, value) { 169 | if (!test.isElement(el)) { 170 | return; 171 | } 172 | if (value === null || value === void 0) { 173 | el.removeAttribute(name); return; 174 | } 175 | var camel = text.hyphenToCamel(name); 176 | if (camel in el) { 177 | el[camel] = value; 178 | } else { 179 | el.setAttribute(name, value); 180 | } 181 | }; 182 | 183 | api.getAttr = function (el, name) { 184 | var camel = text.hyphenToCamel(name); 185 | if (camel in el) { 186 | return el[camel]; 187 | } else if (el.getAttribute) { 188 | return el.getAttribute(name); 189 | } 190 | return null; 191 | }; 192 | 193 | api.manyAttr = function (elem, attrs) { 194 | Object.keys(attrs).forEach(function (attr) { 195 | api.attr(elem, attr, attrs[attr]); 196 | }); 197 | }; 198 | 199 | api.make = function (type) { 200 | return new Dominus(document.createElement(type)); 201 | }; 202 | 203 | api.clone = function (el) { 204 | if (el.cloneNode) { 205 | return el.cloneNode(true); 206 | } 207 | return el; 208 | }; 209 | 210 | api.remove = function (el) { 211 | if (el.parentElement) { 212 | el.parentElement.removeChild(el); 213 | } 214 | }; 215 | 216 | api.append = function (el, target) { 217 | if (manipulationGuard(el, target, api.append)) { 218 | return; 219 | } 220 | if (el.appendChild) { 221 | el.appendChild(target); 222 | } 223 | }; 224 | 225 | api.prepend = function (el, target) { 226 | if (manipulationGuard(el, target, api.prepend)) { 227 | return; 228 | } 229 | if (el.insertBefore) { 230 | el.insertBefore(target, el.firstChild); 231 | } 232 | }; 233 | 234 | api.before = function (el, target) { 235 | if (manipulationGuard(el, target, api.before)) { 236 | return; 237 | } 238 | if (el.parentElement) { 239 | el.parentElement.insertBefore(target, el); 240 | } 241 | }; 242 | 243 | api.after = function (el, target) { 244 | if (manipulationGuard(el, target, api.after)) { 245 | return; 246 | } 247 | if (el.parentElement) { 248 | el.parentElement.insertBefore(target, el.nextSibling); 249 | } 250 | }; 251 | 252 | function manipulationGuard (el, target, fn) { 253 | var right = target instanceof Dominus; 254 | var left = el instanceof Dominus; 255 | if (left) { 256 | el.forEach(manipulateMany); 257 | } else if (right) { 258 | manipulate(el, true); 259 | } 260 | return !el || !target || left || right; 261 | 262 | function manipulate (el, precondition) { 263 | if (right) { 264 | target.forEach(function (target, j) { 265 | fn(el, cloneUnless(target, precondition && j === 0)); 266 | }); 267 | } else { 268 | fn(el, cloneUnless(target, precondition)); 269 | } 270 | } 271 | 272 | function manipulateMany (el, i) { 273 | manipulate(el, i === 0); 274 | } 275 | } 276 | 277 | function cloneUnless (target, condition) { 278 | return condition ? target : api.clone(target); 279 | } 280 | 281 | ['appendTo', 'prependTo', 'beforeOf', 'afterOf'].forEach(flip); 282 | 283 | function flip (key) { 284 | var original = key.split(/[A-Z]/)[0]; 285 | api[key] = function (el, target) { 286 | api[original](target, el); 287 | }; 288 | } 289 | 290 | var numericCssProperties = { 291 | 'column-count': true, 292 | 'fill-opacity': true, 293 | 'flex-grow': true, 294 | 'flex-shrink': true, 295 | 'font-weight': true, 296 | 'line-height': true, 297 | 'opacity': true, 298 | 'order': true, 299 | 'orphans': true, 300 | 'widows': true, 301 | 'z-index': true, 302 | 'zoom': true 303 | }; 304 | var numeric = /^\d+$/; 305 | var canFloat = 'float' in document.body.style; 306 | 307 | api.getCss = function (el, prop) { 308 | if (!test.isElement(el)) { 309 | return null; 310 | } 311 | var hprop = text.hyphenate(prop); 312 | var fprop = !canFloat && hprop === 'float' ? 'cssFloat' : hprop; 313 | var result = global.getComputedStyle(el)[hprop]; 314 | if (prop === 'opacity' && result === '') { 315 | return 1; 316 | } 317 | if (result.substr(-2) === 'px' || numeric.test(result)) { 318 | return parseFloat(result, 10); 319 | } 320 | return result; 321 | }; 322 | 323 | api.setCss = function (props) { 324 | var mapped = Object.keys(props).filter(bad).map(expand); 325 | function bad (prop) { 326 | var value = props[prop]; 327 | return value !== null && value === value; 328 | } 329 | function expand (prop) { 330 | var hprop = text.hyphenate(prop); 331 | var value = props[prop]; 332 | if (typeof value === 'number' && !numericCssProperties[hprop]) { 333 | value += 'px'; 334 | } 335 | return { 336 | name: hprop, value: value 337 | }; 338 | } 339 | return function (el) { 340 | if (!test.isElement(el)) { 341 | return; 342 | } 343 | mapped.forEach(function (prop) { 344 | el.style[prop.name] = prop.value; 345 | }); 346 | }; 347 | }; 348 | -------------------------------------------------------------------------------- /src/dominus.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = require('./Dominus.prototype'); 4 | -------------------------------------------------------------------------------- /src/flatten.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Dominus = require('./Dominus.ctor'); 4 | 5 | function flatten (a, cache) { 6 | return a.reduce(function (current, item) { 7 | if (Dominus.isArray(item)) { 8 | return flatten(item, current); 9 | } else if (current.indexOf(item) === -1) { 10 | return current.concat(item); 11 | } 12 | return current; 13 | }, cache || new Dominus()); 14 | } 15 | 16 | module.exports = flatten; 17 | -------------------------------------------------------------------------------- /src/null.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function nullOp () { return []; }; 4 | -------------------------------------------------------------------------------- /src/public.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var dom = require('./dom'); 4 | var cast = require('./cast'); 5 | var custom = require('./custom'); 6 | var Dominus = require('./Dominus.ctor'); 7 | var tag = /^\s*<([a-z]+(?:-[a-z]+)?)\s*\/?>\s*$/i; 8 | 9 | function api (selector, context) { 10 | var notText = typeof selector !== 'string'; 11 | if (notText && arguments.length < 2) { 12 | return cast(selector); 13 | } 14 | if (notText) { 15 | return new Dominus(); 16 | } 17 | var matches = selector.match(tag); 18 | if (matches) { 19 | return dom.make(matches[1]); 20 | } 21 | return api.find(selector, context); 22 | } 23 | 24 | api.find = function (selector, context) { 25 | return dom.qsa(context, selector); 26 | }; 27 | 28 | api.findOne = function (selector, context) { 29 | return dom.qs(context, selector); 30 | }; 31 | 32 | api.custom = custom.register; 33 | 34 | module.exports = api; 35 | -------------------------------------------------------------------------------- /src/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var elementObjects = typeof HTMLElement === 'object'; 4 | 5 | function isElement (o) { 6 | return elementObjects ? o instanceof HTMLElement : isElementObject(o); 7 | } 8 | 9 | function isElementObject (o) { 10 | return o && 11 | typeof o === 'object' && 12 | typeof o.nodeName === 'string' && 13 | o.nodeType === 1; 14 | } 15 | 16 | function isArray (a) { 17 | return Object.prototype.toString.call(a) === '[object Array]'; 18 | } 19 | 20 | function isCheckable (elem) { 21 | return 'checked' in elem && elem.type === 'radio' || elem.type === 'checkbox'; 22 | } 23 | 24 | module.exports = { 25 | isElement: isElement, 26 | isArray: isArray, 27 | isCheckable: isCheckable 28 | }; 29 | -------------------------------------------------------------------------------- /src/text.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function hyphenToCamel (hyphens) { 4 | var part = /-([a-z])/g; 5 | return hyphens.replace(part, function (g, m) { 6 | return m.toUpperCase(); 7 | }); 8 | } 9 | 10 | function hyphenate (text) { 11 | var camel = /([a-z])([A-Z])/g; 12 | return text.replace(camel, '$1-$2').toLowerCase(); 13 | } 14 | 15 | module.exports = { 16 | hyphenToCamel: hyphenToCamel, 17 | hyphenate: hyphenate 18 | }; 19 | --------------------------------------------------------------------------------