@domql/element 2.0.6 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +5 -5
- package/package.json +7 -11
- package/create.js +0 -167
- package/iterate.js +0 -80
- package/methods.js +0 -96
- package/set.js +0 -44
- package/update.js +0 -85
package/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
export * from '
|
|
4
|
-
export * from '
|
|
5
|
-
export * from '
|
|
6
|
-
export * from '
|
|
7
|
-
export * from '
|
|
3
|
+
export * from '@domql/methods'
|
|
4
|
+
export * from '@domql/iterate'
|
|
5
|
+
export * from '@domql/update'
|
|
6
|
+
export * from '@domql/create'
|
|
7
|
+
export * from '@domql/set'
|
package/package.json
CHANGED
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@domql/element",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@domql/
|
|
8
|
-
"@domql/
|
|
9
|
-
"@domql/
|
|
10
|
-
"@domql/
|
|
11
|
-
"@domql/
|
|
12
|
-
"@domql/registry": "latest",
|
|
13
|
-
"@domql/state": "latest",
|
|
14
|
-
"@domql/tree": "latest",
|
|
15
|
-
"@domql/utils": "latest"
|
|
7
|
+
"@domql/create": "latest",
|
|
8
|
+
"@domql/iterate": "latest",
|
|
9
|
+
"@domql/methods": "latest",
|
|
10
|
+
"@domql/set": "latest",
|
|
11
|
+
"@domql/update": "latest"
|
|
16
12
|
},
|
|
17
|
-
"gitHead": "
|
|
13
|
+
"gitHead": "1e384e4a15f44201165f6bd54efb4a0e9c105745",
|
|
18
14
|
"source": "index.js"
|
|
19
15
|
}
|
package/create.js
DELETED
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import { DEFAULT_METHODS, TAGS } from '@domql/registry'
|
|
4
|
-
|
|
5
|
-
import { root } from '@domql/tree'
|
|
6
|
-
import { createKey } from '@domql/key'
|
|
7
|
-
import { isNumber, isString, isObject, isNode, isFunction, isArray, exec } from '@domql/utils'
|
|
8
|
-
import { createState } from '@domql/state'
|
|
9
|
-
import { createProps } from '@domql/props'
|
|
10
|
-
import { extendElement } from '@domql/extends'
|
|
11
|
-
|
|
12
|
-
const OPTIONS = {}
|
|
13
|
-
|
|
14
|
-
const init = (element, key, options, parent) => {
|
|
15
|
-
const ref = {}
|
|
16
|
-
if (isString(element) || isNumber(element)) {
|
|
17
|
-
return {
|
|
18
|
-
key,
|
|
19
|
-
ref,
|
|
20
|
-
text: element
|
|
21
|
-
}
|
|
22
|
-
} else if (isArray(element)) return Object.assign({}, element)
|
|
23
|
-
else if (isObject(element)) {
|
|
24
|
-
if (!element.ref) element.ref = ref
|
|
25
|
-
if (element.on && element.on.init) element.on.init(element, element.state)
|
|
26
|
-
return element
|
|
27
|
-
} else if (isFunction(element)) return exec(parent, parent.ref.state)
|
|
28
|
-
else if (!element) return { ref }
|
|
29
|
-
return element
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const assignKey = (element, key) => {
|
|
33
|
-
if (element.key) return element
|
|
34
|
-
element.key = key || createKey.next().value
|
|
35
|
-
return element
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const applyParent = (element, key) => {
|
|
39
|
-
const { ref } = element
|
|
40
|
-
const { parent } = ref
|
|
41
|
-
if (isNode(parent)) {
|
|
42
|
-
ref.parent = root.ref.parent = { node: parent }
|
|
43
|
-
}
|
|
44
|
-
if (!parent) ref.parent = root
|
|
45
|
-
return element
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const applyState = (element, key) => {
|
|
49
|
-
const { ref } = element
|
|
50
|
-
ref.state = createState(element, element.ref.parent)
|
|
51
|
-
return element
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const applyExtends = (element, key) => {
|
|
55
|
-
extendElement(element, element.ref.parent)
|
|
56
|
-
return element
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const applyTag = (element, key) => {
|
|
60
|
-
if (element.tag) {
|
|
61
|
-
element.ref.tag = element.tag
|
|
62
|
-
return element
|
|
63
|
-
}
|
|
64
|
-
const keyIsTag = TAGS.body.indexOf(key) > -1
|
|
65
|
-
element.tag = element.ref.tag = keyIsTag ? key : 'div'
|
|
66
|
-
return element
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const applyProps = (element, key) => {
|
|
70
|
-
const { ref } = element
|
|
71
|
-
ref.props = createProps(element, element.ref.parent)
|
|
72
|
-
return element
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const onEachAvailable = (element, key, options) => {
|
|
76
|
-
const { ref } = element
|
|
77
|
-
const value = element[key]
|
|
78
|
-
let { children, childrenKeys } = ref
|
|
79
|
-
if (!children) children = ref.children = []
|
|
80
|
-
if (!childrenKeys) childrenKeys = ref.childrenKeys = []
|
|
81
|
-
|
|
82
|
-
// add to ref.children
|
|
83
|
-
const useOption = options[onEachAvailable]
|
|
84
|
-
if (useOption) useOption(element, key)
|
|
85
|
-
|
|
86
|
-
// move value to ref.children
|
|
87
|
-
children.push(value)
|
|
88
|
-
childrenKeys.push(key)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const onEach = (element, key, options) => {
|
|
92
|
-
for (const key in element) {
|
|
93
|
-
const isMethod = DEFAULT_METHODS[key]
|
|
94
|
-
if (isMethod && isFunction(isMethod)) isMethod(element, element.ref.state)
|
|
95
|
-
const hasDefine = element.define && element.define[key]
|
|
96
|
-
if (hasDefine && isFunction(hasDefine)) element.ref[key] = hasDefine(element, element.ref.state)
|
|
97
|
-
if (!isMethod && !hasDefine) onEachAvailable(element, key, options)
|
|
98
|
-
}
|
|
99
|
-
return element
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const applyTransform = (element, key, options) => {
|
|
103
|
-
const { ref, transform } = element
|
|
104
|
-
if (!transform) return element
|
|
105
|
-
if (!ref.transform) ref.transform = {}
|
|
106
|
-
const keys = Object.keys(transform || {})
|
|
107
|
-
keys.map(key => {
|
|
108
|
-
const transformer = transform[key]
|
|
109
|
-
ref.transform[key] = transformer(element, key)
|
|
110
|
-
return key
|
|
111
|
-
})
|
|
112
|
-
return element
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const addChildren = (element, key, options) => {
|
|
116
|
-
const { ref } = element
|
|
117
|
-
const { children } = ref
|
|
118
|
-
|
|
119
|
-
if (children && children.length) {
|
|
120
|
-
ref.children = children.map(child => {
|
|
121
|
-
return create(child, element, key, options)
|
|
122
|
-
})
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return element
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const applyGlobalTransform = (element, key, options) => {
|
|
129
|
-
const { ref } = element
|
|
130
|
-
const { transform } = options
|
|
131
|
-
if (!transform) return element
|
|
132
|
-
if (!ref.transform) ref.transform = {}
|
|
133
|
-
const keys = Object.keys(transform || {})
|
|
134
|
-
keys.map(key => {
|
|
135
|
-
const transformer = transform[key]
|
|
136
|
-
ref.transform[key] = transformer(element, key)
|
|
137
|
-
return key
|
|
138
|
-
})
|
|
139
|
-
return element
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Creating a DOMQL element
|
|
144
|
-
*/
|
|
145
|
-
export const create = (element, parent, key, options = OPTIONS) => [
|
|
146
|
-
init,
|
|
147
|
-
assignKey,
|
|
148
|
-
applyParent,
|
|
149
|
-
applyState,
|
|
150
|
-
applyExtends,
|
|
151
|
-
applyTag,
|
|
152
|
-
applyProps,
|
|
153
|
-
onEach,
|
|
154
|
-
applyTransform,
|
|
155
|
-
addChildren,
|
|
156
|
-
applyGlobalTransform
|
|
157
|
-
].reduce((prev, current) => current(prev, key, options, parent), element)
|
|
158
|
-
|
|
159
|
-
// create({
|
|
160
|
-
// test: {
|
|
161
|
-
// test2: {}
|
|
162
|
-
// }
|
|
163
|
-
// }, null, null, {
|
|
164
|
-
// transform: {
|
|
165
|
-
// react: transformReact
|
|
166
|
-
// }
|
|
167
|
-
// })
|
package/iterate.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import { exec, isFunction, isNumber, isString, overwrite } from '@domql/utils'
|
|
4
|
-
import { isMethod } from './methods'
|
|
5
|
-
|
|
6
|
-
export const applyEvents = element => {
|
|
7
|
-
const { node, on } = element
|
|
8
|
-
for (const param in on) {
|
|
9
|
-
if (
|
|
10
|
-
param === 'init' ||
|
|
11
|
-
param === 'render' ||
|
|
12
|
-
param === 'update'
|
|
13
|
-
) continue
|
|
14
|
-
|
|
15
|
-
const appliedFunction = element.on[param]
|
|
16
|
-
if (isFunction(appliedFunction)) {
|
|
17
|
-
node.addEventListener(param, event =>
|
|
18
|
-
appliedFunction(event, element, element.state),
|
|
19
|
-
true)
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export const throughInitialExec = element => {
|
|
25
|
-
for (const param in element) {
|
|
26
|
-
const prop = element[param]
|
|
27
|
-
if (isFunction(prop) && !isMethod(param)) {
|
|
28
|
-
element.__exec[param] = prop
|
|
29
|
-
element[param] = prop(element, element.state)
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export const throughUpdatedExec = (element, options) => {
|
|
35
|
-
const { __exec } = element
|
|
36
|
-
const changes = {}
|
|
37
|
-
|
|
38
|
-
for (const param in __exec) {
|
|
39
|
-
const prop = element[param]
|
|
40
|
-
const newExec = __exec[param](element, element.state)
|
|
41
|
-
|
|
42
|
-
// if element is string
|
|
43
|
-
if (prop && prop.node && (isString(newExec) || isNumber(newExec))) {
|
|
44
|
-
overwrite(prop, { text: newExec }, options)
|
|
45
|
-
} else if (newExec !== prop) {
|
|
46
|
-
element.__cached[param] = changes[param] = prop
|
|
47
|
-
element[param] = newExec
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return changes
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export const throughInitialDefine = element => {
|
|
55
|
-
const { define } = element
|
|
56
|
-
for (const param in define) {
|
|
57
|
-
let prop = element[param]
|
|
58
|
-
|
|
59
|
-
if (isFunction(prop) && !isMethod(param)) {
|
|
60
|
-
element.__exec[param] = prop
|
|
61
|
-
element[param] = prop = exec(prop, element)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
element.__cached[param] = prop
|
|
65
|
-
element[param] = define[param](prop, element, element.state)
|
|
66
|
-
}
|
|
67
|
-
return element
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export const throughUpdatedDefine = element => {
|
|
71
|
-
const { define, __exec } = element
|
|
72
|
-
const changes = {}
|
|
73
|
-
for (const param in define) {
|
|
74
|
-
const execParam = __exec[param]
|
|
75
|
-
if (execParam) element.__cached[param] = execParam(element, element.state)
|
|
76
|
-
const cached = exec(element.__cached[param], element)
|
|
77
|
-
element[param] = define[param](cached, element, element.state)
|
|
78
|
-
}
|
|
79
|
-
return changes
|
|
80
|
-
}
|
package/methods.js
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import { isObject, isObjectLike } from '@domql/utils'
|
|
4
|
-
import { DEFAULT_METHODS } from '@domql/registry'
|
|
5
|
-
|
|
6
|
-
// TODO: update these files
|
|
7
|
-
export const lookup = function (key) {
|
|
8
|
-
const element = this
|
|
9
|
-
let { parent } = element
|
|
10
|
-
|
|
11
|
-
while (parent.key !== key) {
|
|
12
|
-
parent = parent.parent
|
|
13
|
-
if (!parent) return
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return parent
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const remove = function (params) {
|
|
20
|
-
const element = this
|
|
21
|
-
element.node.remove()
|
|
22
|
-
delete element.parent[element.key]
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const get = function (param) {
|
|
26
|
-
const element = this
|
|
27
|
-
return element[param]
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// export const set = function () {
|
|
31
|
-
// }
|
|
32
|
-
|
|
33
|
-
// export const update = function () {
|
|
34
|
-
// }
|
|
35
|
-
|
|
36
|
-
export const defineSetter = (element, key, get, set) =>
|
|
37
|
-
Object.defineProperty(element, key, { get, set })
|
|
38
|
-
|
|
39
|
-
export const keys = function () {
|
|
40
|
-
const element = this
|
|
41
|
-
const keys = []
|
|
42
|
-
for (const param in element) {
|
|
43
|
-
if (!isObject(DEFAULT_METHODS[param])) {
|
|
44
|
-
keys.push(param)
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return keys
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export const parse = function () {
|
|
51
|
-
const element = this
|
|
52
|
-
const obj = {}
|
|
53
|
-
const keys = element.keys()
|
|
54
|
-
keys.forEach(v => (obj[v] = element[v]))
|
|
55
|
-
return obj
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export const parseDeep = function (param) {
|
|
59
|
-
const element = this
|
|
60
|
-
const orig = param || element
|
|
61
|
-
const obj = {}
|
|
62
|
-
const keys = orig.keys && orig.keys()
|
|
63
|
-
if (!keys) return
|
|
64
|
-
keys.forEach(v => {
|
|
65
|
-
const prop = orig[v]
|
|
66
|
-
if (isObjectLike(prop)) parseDeep(prop)
|
|
67
|
-
else obj[v] = prop
|
|
68
|
-
})
|
|
69
|
-
return obj
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export const log = function (...args) {
|
|
73
|
-
const element = this
|
|
74
|
-
console.group(element.key)
|
|
75
|
-
if (args.length) {
|
|
76
|
-
args.forEach(v => console.log(`%c${v}:\n`, 'font-weight: bold', element[v]))
|
|
77
|
-
} else {
|
|
78
|
-
console.log(element.path)
|
|
79
|
-
const keys = element.keys()
|
|
80
|
-
keys.forEach(v => console.log(`%c${v}:\n`, 'font-weight: bold', element[v]))
|
|
81
|
-
}
|
|
82
|
-
console.groupEnd(element.key)
|
|
83
|
-
return element
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export const isMethod = function (param) {
|
|
87
|
-
return param === 'set' ||
|
|
88
|
-
param === 'update' ||
|
|
89
|
-
param === 'remove' ||
|
|
90
|
-
param === 'lookup' ||
|
|
91
|
-
param === 'keys' ||
|
|
92
|
-
param === 'parse' ||
|
|
93
|
-
param === 'parseDeep' ||
|
|
94
|
-
param === 'if' ||
|
|
95
|
-
param === 'log'
|
|
96
|
-
}
|
package/set.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import { create } from './create'
|
|
4
|
-
|
|
5
|
-
const removeContentElement = (params, element) => {
|
|
6
|
-
if (params && element.content) {
|
|
7
|
-
if (element.content.node) {
|
|
8
|
-
if (element.content.tag === 'fragment') element.node.innerHTML = ''
|
|
9
|
-
else element.node.removeChild(element.content.node)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
if (element.__cached && element.__cached.content) {
|
|
13
|
-
if (element.__cached.content.tag === 'fragment') element.__cached.content.parent.node.innerHTML = ''
|
|
14
|
-
else element.__cached.content.remove()
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
delete element.content
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const set = function (params, enter, leave) {
|
|
22
|
-
const element = this
|
|
23
|
-
|
|
24
|
-
removeContentElement(params, element)
|
|
25
|
-
|
|
26
|
-
if (params) {
|
|
27
|
-
const { childProto } = params
|
|
28
|
-
if (!childProto && element.childProto) params.childProto = element.childProto
|
|
29
|
-
create(params, element, 'content', {
|
|
30
|
-
ignoreChildProto: true
|
|
31
|
-
})
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return element
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// if (element.content && (isFunction(element.content) || element.content.node)) {
|
|
38
|
-
// // leave(element, () => {
|
|
39
|
-
// // console.log('remove', element.content)
|
|
40
|
-
// // element.content.remove()
|
|
41
|
-
// // element.content.update(params)
|
|
42
|
-
// // element.node.removeChild(element.content.node)
|
|
43
|
-
// // delete element.content
|
|
44
|
-
// }
|
package/update.js
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import { overwrite, isFunction, isObject, isString, isNumber, merge } from '@domql/utils'
|
|
4
|
-
import { defaultMethods } from '@domql/mixins'
|
|
5
|
-
import { updateProps } from '@domql/props'
|
|
6
|
-
// import { createNode } from '@domql/node'
|
|
7
|
-
import { on } from '@domql/event'
|
|
8
|
-
|
|
9
|
-
import { isMethod } from './methods'
|
|
10
|
-
import { throughUpdatedDefine, throughUpdatedExec } from './iterate'
|
|
11
|
-
// import { appendNode } from './assign'
|
|
12
|
-
|
|
13
|
-
const UPDATE_DEFAULT_OPTIONS = {
|
|
14
|
-
stackChanges: false,
|
|
15
|
-
cleanExec: true,
|
|
16
|
-
preventRecursive: false
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const update = function (params = {}, options = UPDATE_DEFAULT_OPTIONS) {
|
|
20
|
-
const element = this
|
|
21
|
-
const { define, parent, node } = element
|
|
22
|
-
|
|
23
|
-
// console.groupCollapsed('Update:', element.path)
|
|
24
|
-
// console.groupEnd('Update:')
|
|
25
|
-
// if params is string
|
|
26
|
-
if (isString(params) || isNumber(params)) {
|
|
27
|
-
params = { text: params }
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (element.on && isFunction(element.on.initUpdate)) {
|
|
31
|
-
on.initUpdate(element.on.initUpdate, element, element.state)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
updateProps(params.props, element, parent)
|
|
35
|
-
|
|
36
|
-
// console.groupCollapsed('UPDATE:')
|
|
37
|
-
// console.groupEnd('UPDATE:')
|
|
38
|
-
|
|
39
|
-
const overwriteChanges = overwrite(element, params, UPDATE_DEFAULT_OPTIONS)
|
|
40
|
-
const execChanges = throughUpdatedExec(element, UPDATE_DEFAULT_OPTIONS)
|
|
41
|
-
const definedChanges = throughUpdatedDefine(element)
|
|
42
|
-
|
|
43
|
-
if (UPDATE_DEFAULT_OPTIONS.stackChanges && element.__stackChanges) {
|
|
44
|
-
const stackChanges = merge(definedChanges, merge(execChanges, overwriteChanges))
|
|
45
|
-
element.__stackChanges.push(stackChanges)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (isFunction(element.if)) {
|
|
49
|
-
// TODO: move as fragment
|
|
50
|
-
const ifPassed = element.if(element, element.state)
|
|
51
|
-
if (element.__ifFalsy && ifPassed) {
|
|
52
|
-
// createNode(element)
|
|
53
|
-
// appendNode(element.node, element.__ifFragment)
|
|
54
|
-
delete element.__ifFalsy
|
|
55
|
-
} else if (element.node && !ifPassed) {
|
|
56
|
-
element.node.remove()
|
|
57
|
-
element.__ifFalsy = true
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// console.groupEnd('Update:')
|
|
62
|
-
|
|
63
|
-
if (!node || options.preventRecursive) return
|
|
64
|
-
|
|
65
|
-
for (const param in element) {
|
|
66
|
-
const prop = element[param]
|
|
67
|
-
|
|
68
|
-
if (isMethod(param) || isObject(defaultMethods[param]) || prop === undefined) continue
|
|
69
|
-
|
|
70
|
-
const hasDefined = define && define[param]
|
|
71
|
-
const ourParam = defaultMethods[param]
|
|
72
|
-
|
|
73
|
-
if (ourParam) {
|
|
74
|
-
if (isFunction(ourParam)) ourParam(prop, element, node)
|
|
75
|
-
} else if (prop && isObject(prop) && !hasDefined) {
|
|
76
|
-
update.call(prop, params[prop], UPDATE_DEFAULT_OPTIONS)
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if (element.on && isFunction(element.on.update)) {
|
|
81
|
-
on.update(element.on.update, element, element.state)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return element
|
|
85
|
-
}
|