C-style string comparisons, fixes #190
This commit is contained in:
@@ -21,6 +21,7 @@ import android.text.TextUtils;
|
|||||||
import org.oscim.theme.IRenderTheme.ThemeException;
|
import org.oscim.theme.IRenderTheme.ThemeException;
|
||||||
import org.oscim.theme.ThemeFile;
|
import org.oscim.theme.ThemeFile;
|
||||||
import org.oscim.theme.XmlRenderThemeMenuCallback;
|
import org.oscim.theme.XmlRenderThemeMenuCallback;
|
||||||
|
import org.oscim.utils.Utils;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
@@ -75,7 +76,7 @@ public class AssetsRenderTheme implements ThemeFile {
|
|||||||
if (mInputStream != other.mInputStream) {
|
if (mInputStream != other.mInputStream) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (mRelativePathPrefix != other.mRelativePathPrefix) {
|
if (!Utils.equals(mRelativePathPrefix, other.mRelativePathPrefix)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 Hannes Janetzek
|
* Copyright 2013 Hannes Janetzek
|
||||||
|
* Copyright 2016 devemux86
|
||||||
*
|
*
|
||||||
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
||||||
*
|
*
|
||||||
@@ -147,7 +148,7 @@ public class OSciMap2TileSource extends UrlTileSource {
|
|||||||
String key = Tags.keys[mSArray[curTag]];
|
String key = Tags.keys[mSArray[curTag]];
|
||||||
Tag tag;
|
Tag tag;
|
||||||
|
|
||||||
if (key == Tag.KEY_NAME)
|
if (Tag.KEY_NAME.equals(key))
|
||||||
tag = new Tag(key, tagString, false);
|
tag = new Tag(key, tagString, false);
|
||||||
else
|
else
|
||||||
tag = new Tag(key, tagString, true);
|
tag = new Tag(key, tagString, true);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010, 2011, 2012 mapsforge.org
|
* Copyright 2010, 2011, 2012 mapsforge.org
|
||||||
* Copyright 2013 Hannes Janetzek
|
* Copyright 2013 Hannes Janetzek
|
||||||
|
* Copyright 2016 devemux86
|
||||||
*
|
*
|
||||||
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
||||||
*
|
*
|
||||||
@@ -17,6 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.oscim.core;
|
package org.oscim.core;
|
||||||
|
|
||||||
|
import org.oscim.utils.Utils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A tag represents an immutable key-value pair. Keys are always intern().
|
* A tag represents an immutable key-value pair. Keys are always intern().
|
||||||
*/
|
*/
|
||||||
@@ -107,11 +110,11 @@ public class Tag {
|
|||||||
}
|
}
|
||||||
Tag other = (Tag) obj;
|
Tag other = (Tag) obj;
|
||||||
|
|
||||||
if (key != other.key)
|
if (!Utils.equals(key, other.key))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (intern && other.intern) {
|
if (intern && other.intern) {
|
||||||
if (value == other.value)
|
if (Utils.equals(value, other.value))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
} else if (!intern && value.equals(other.value)) {
|
} else if (!intern && value.equals(other.value)) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 Hannes Janetzek
|
* Copyright 2013 Hannes Janetzek
|
||||||
* Copyright 2016 Andrey Novikov
|
* Copyright 2016 Andrey Novikov
|
||||||
|
* Copyright 2016 devemux86
|
||||||
*
|
*
|
||||||
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
||||||
*
|
*
|
||||||
@@ -17,6 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.oscim.core;
|
package org.oscim.core;
|
||||||
|
|
||||||
|
import org.oscim.utils.Utils;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -84,7 +87,7 @@ public class TagSet {
|
|||||||
*/
|
*/
|
||||||
public Tag get(String key) {
|
public Tag get(String key) {
|
||||||
for (int i = 0; i < numTags; i++) {
|
for (int i = 0; i < numTags; i++) {
|
||||||
if (tags[i].key.equals(key))
|
if (Utils.equals(tags[i].key, key))
|
||||||
return tags[i];
|
return tags[i];
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -98,7 +101,7 @@ public class TagSet {
|
|||||||
*/
|
*/
|
||||||
public boolean containsKey(String key) {
|
public boolean containsKey(String key) {
|
||||||
for (int i = 0; i < numTags; i++) {
|
for (int i = 0; i < numTags; i++) {
|
||||||
if (tags[i].key.equals(key))
|
if (Utils.equals(tags[i].key, key))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -112,7 +115,7 @@ public class TagSet {
|
|||||||
*/
|
*/
|
||||||
public String getValue(String key) {
|
public String getValue(String key) {
|
||||||
for (int i = 0; i < numTags; i++) {
|
for (int i = 0; i < numTags; i++) {
|
||||||
if (tags[i].key.equals(key))
|
if (Utils.equals(tags[i].key, key))
|
||||||
return tags[i].value;
|
return tags[i].value;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -155,7 +158,7 @@ public class TagSet {
|
|||||||
public boolean contains(Tag tag) {
|
public boolean contains(Tag tag) {
|
||||||
for (int i = 0; i < numTags; i++) {
|
for (int i = 0; i < numTags; i++) {
|
||||||
Tag t = tags[i];
|
Tag t = tags[i];
|
||||||
if ((t == tag) || (t.key.equals(tag.key) && t.value.equals(tag.value)))
|
if ((t == tag) || (Utils.equals(t.key, tag.key) && Utils.equals(t.value, tag.value)))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -170,8 +173,8 @@ public class TagSet {
|
|||||||
*/
|
*/
|
||||||
public boolean contains(String key, String value) {
|
public boolean contains(String key, String value) {
|
||||||
for (int i = 0; i < numTags; i++) {
|
for (int i = 0; i < numTags; i++) {
|
||||||
if (tags[i].key.equals(key))
|
if (Utils.equals(tags[i].key, key))
|
||||||
return value.equals(tags[i].value);
|
return Utils.equals(tags[i].value, value);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2013 Hannes Janetzek
|
||||||
|
* Copyright 2016 devemux86
|
||||||
|
*
|
||||||
|
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the
|
||||||
|
* terms of the GNU Lesser General Public License as published by the Free Software
|
||||||
|
* Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License along with
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
package org.oscim.layers.tile.vector;
|
package org.oscim.layers.tile.vector;
|
||||||
|
|
||||||
import org.oscim.core.Tag;
|
import org.oscim.core.Tag;
|
||||||
import org.oscim.core.TagSet;
|
import org.oscim.core.TagSet;
|
||||||
import org.oscim.layers.tile.TileLoader;
|
import org.oscim.layers.tile.TileLoader;
|
||||||
import org.oscim.map.Map;
|
import org.oscim.map.Map;
|
||||||
|
import org.oscim.utils.Utils;
|
||||||
|
|
||||||
public class OsmTileLayer extends VectorTileLayer {
|
public class OsmTileLayer extends VectorTileLayer {
|
||||||
|
|
||||||
@@ -52,7 +70,7 @@ public class OsmTileLayer extends VectorTileLayer {
|
|||||||
Tag t = tags[i];
|
Tag t = tags[i];
|
||||||
|
|
||||||
for (TagReplacement replacement : mTagReplacement) {
|
for (TagReplacement replacement : mTagReplacement) {
|
||||||
if (t.key == replacement.key) {
|
if (Utils.equals(t.key, replacement.key)) {
|
||||||
mFilteredTags.add(replacement.tag);
|
mFilteredTags.add(replacement.tag);
|
||||||
continue O;
|
continue O;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2012 Hannes Janetzek
|
* Copyright 2012 Hannes Janetzek
|
||||||
* Copyright 2016 Longri
|
* Copyright 2016 Longri
|
||||||
|
* Copyright 2016 devemux86
|
||||||
*
|
*
|
||||||
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
||||||
*
|
*
|
||||||
@@ -150,7 +151,7 @@ public final class PolygonBucket extends RenderBucket {
|
|||||||
uMVP = getUniform("u_mvp");
|
uMVP = getUniform("u_mvp");
|
||||||
aPos = getAttrib("a_pos");
|
aPos = getAttrib("a_pos");
|
||||||
uColor = getUniform("u_color");
|
uColor = getUniform("u_color");
|
||||||
if (shaderFile == "polygon_layer_tex")
|
if ("polygon_layer_tex".equals(shaderFile))
|
||||||
uScale = getUniform("u_scale");
|
uScale = getUniform("u_scale");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -291,14 +292,10 @@ public final class PolygonBucket extends RenderBucket {
|
|||||||
* draw polygon buckets (until bucket.next is not polygon bucket)
|
* draw polygon buckets (until bucket.next is not polygon bucket)
|
||||||
* using stencil buffer method
|
* using stencil buffer method
|
||||||
*
|
*
|
||||||
* @param buckets layer to draw (referencing vertices in current vbo)
|
* @param buckets layer to draw (referencing vertices in current vbo)
|
||||||
* @param v GLViewport
|
* @param v GLViewport
|
||||||
* @param pos used to fade buckets according to 'fade' in
|
* @param div scale relative to 'base scale' of the tile
|
||||||
* layer.area style
|
* @param first pass true to clear stencil buffer region
|
||||||
* @param div scale relative to 'base scale' of the tile
|
|
||||||
* @param first pass true to clear stencil buffer region
|
|
||||||
* @param clipMode clip to first quad in current vbo
|
|
||||||
* using CLIP_STENCIL / CLIP_DEPTH
|
|
||||||
* @return next layer
|
* @return next layer
|
||||||
*/
|
*/
|
||||||
public static RenderBucket draw(RenderBucket buckets, GLViewport v,
|
public static RenderBucket draw(RenderBucket buckets, GLViewport v,
|
||||||
@@ -440,8 +437,8 @@ public final class PolygonBucket extends RenderBucket {
|
|||||||
* Draw a tile filling rectangle to set stencil- and depth buffer
|
* Draw a tile filling rectangle to set stencil- and depth buffer
|
||||||
* appropriately
|
* appropriately
|
||||||
*
|
*
|
||||||
* @param first in the first run the clip region is set based on
|
* @param clipMode clip to first quad in current vbo
|
||||||
* depth buffer and depth buffer is updated
|
* using CLIP_STENCIL / CLIP_DEPTH
|
||||||
*/
|
*/
|
||||||
static void drawStencilRegion(int clipMode) {
|
static void drawStencilRegion(int clipMode) {
|
||||||
//log.debug("draw stencil {}", clipMode);
|
//log.debug("draw stencil {}", clipMode);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 Hannes Janetzek
|
* Copyright 2013 Hannes Janetzek
|
||||||
|
* Copyright 2016 devemux86
|
||||||
*
|
*
|
||||||
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
||||||
*
|
*
|
||||||
@@ -18,6 +19,7 @@ package org.oscim.theme;
|
|||||||
|
|
||||||
import org.oscim.core.Tag;
|
import org.oscim.core.Tag;
|
||||||
import org.oscim.core.TagSet;
|
import org.oscim.core.TagSet;
|
||||||
|
import org.oscim.utils.Utils;
|
||||||
|
|
||||||
class MatchingCacheKey {
|
class MatchingCacheKey {
|
||||||
int mHash;
|
int mHash;
|
||||||
@@ -44,7 +46,7 @@ class MatchingCacheKey {
|
|||||||
Tag t1 = tags.tags[i];
|
Tag t1 = tags.tags[i];
|
||||||
Tag t2 = compare.mTags[i];
|
Tag t2 = compare.mTags[i];
|
||||||
|
|
||||||
if (!(t1 == t2 || (t1.key == t2.key && t1.value == t2.value)))
|
if (!(t1 == t2 || (Utils.equals(t1.key, t2.key) && Utils.equals(t1.value, t2.value))))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i == numTags)
|
if (i == numTags)
|
||||||
@@ -86,7 +88,7 @@ class MatchingCacheKey {
|
|||||||
Tag t1 = mTags[i];
|
Tag t1 = mTags[i];
|
||||||
Tag t2 = other.mTags[i];
|
Tag t2 = other.mTags[i];
|
||||||
|
|
||||||
if (!(t1 == t2 || (t1.key == t2.key && t1.value == t2.value)))
|
if (!(t1 == t2 || (Utils.equals(t1.key, t2.key) && Utils.equals(t1.value, t2.value))))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
package org.oscim.theme;
|
package org.oscim.theme;
|
||||||
|
|
||||||
import org.oscim.theme.IRenderTheme.ThemeException;
|
import org.oscim.theme.IRenderTheme.ThemeException;
|
||||||
|
import org.oscim.utils.Utils;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
@@ -59,7 +60,7 @@ public class StreamRenderTheme implements ThemeFile {
|
|||||||
if (mInputStream != other.mInputStream) {
|
if (mInputStream != other.mInputStream) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (mRelativePathPrefix != other.mRelativePathPrefix) {
|
if (!Utils.equals(mRelativePathPrefix, other.mRelativePathPrefix)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ package org.oscim.theme.rule;
|
|||||||
import org.oscim.core.Tag;
|
import org.oscim.core.Tag;
|
||||||
import org.oscim.theme.rule.RuleBuilder.RuleType;
|
import org.oscim.theme.rule.RuleBuilder.RuleType;
|
||||||
import org.oscim.theme.styles.RenderStyle;
|
import org.oscim.theme.styles.RenderStyle;
|
||||||
|
import org.oscim.utils.Utils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -190,7 +191,7 @@ public class Rule {
|
|||||||
@Override
|
@Override
|
||||||
public boolean matchesTags(Tag[] tags) {
|
public boolean matchesTags(Tag[] tags) {
|
||||||
for (Tag tag : tags)
|
for (Tag tag : tags)
|
||||||
if (mKey == tag.key)
|
if (Utils.equals(mKey, tag.key))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -209,7 +210,7 @@ public class Rule {
|
|||||||
@Override
|
@Override
|
||||||
public boolean matchesTags(Tag[] tags) {
|
public boolean matchesTags(Tag[] tags) {
|
||||||
for (Tag tag : tags)
|
for (Tag tag : tags)
|
||||||
if (mValue == tag.value)
|
if (Utils.equals(mValue, tag.value))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -231,8 +232,8 @@ public class Rule {
|
|||||||
@Override
|
@Override
|
||||||
public boolean matchesTags(Tag[] tags) {
|
public boolean matchesTags(Tag[] tags) {
|
||||||
for (Tag tag : tags)
|
for (Tag tag : tags)
|
||||||
if (mKey == tag.key)
|
if (Utils.equals(mKey, tag.key))
|
||||||
return (mValue == tag.value);
|
return (Utils.equals(mValue, tag.value));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -263,7 +264,7 @@ public class Rule {
|
|||||||
if (mKeys == null) {
|
if (mKeys == null) {
|
||||||
for (Tag tag : tags) {
|
for (Tag tag : tags) {
|
||||||
for (String value : mValues) {
|
for (String value : mValues) {
|
||||||
if (value == tag.value)
|
if (Utils.equals(value, tag.value))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -272,12 +273,12 @@ public class Rule {
|
|||||||
|
|
||||||
for (Tag tag : tags)
|
for (Tag tag : tags)
|
||||||
for (String key : mKeys) {
|
for (String key : mKeys) {
|
||||||
if (key == tag.key) {
|
if (Utils.equals(key, tag.key)) {
|
||||||
if (mValues == null)
|
if (mValues == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
for (String value : mValues) {
|
for (String value : mValues) {
|
||||||
if (value == tag.value)
|
if (Utils.equals(value, tag.value))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -319,7 +320,7 @@ public class Rule {
|
|||||||
|
|
||||||
for (Tag tag : tags)
|
for (Tag tag : tags)
|
||||||
for (String value : values)
|
for (String value : values)
|
||||||
if (value == tag.value)
|
if (Utils.equals(value, tag.value))
|
||||||
return !exclusive;
|
return !exclusive;
|
||||||
|
|
||||||
return exclusive;
|
return exclusive;
|
||||||
@@ -328,7 +329,7 @@ public class Rule {
|
|||||||
private boolean containsKeys(Tag[] tags) {
|
private boolean containsKeys(Tag[] tags) {
|
||||||
for (Tag tag : tags)
|
for (Tag tag : tags)
|
||||||
for (String key : keys)
|
for (String key : keys)
|
||||||
if (key == tag.key)
|
if (Utils.equals(key, tag.key))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 Hannes Janetzek
|
* Copyright 2013 Hannes Janetzek
|
||||||
|
* Copyright 2016 devemux86
|
||||||
*
|
*
|
||||||
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
||||||
*
|
*
|
||||||
@@ -218,12 +219,12 @@ public class TileDecoder extends PbfDecoder {
|
|||||||
|
|
||||||
// FIXME filter out all variable tags
|
// FIXME filter out all variable tags
|
||||||
// might depend on theme though
|
// might depend on theme though
|
||||||
if (key == Tag.KEY_NAME
|
if (Tag.KEY_NAME.equals(key)
|
||||||
|| key == Tag.KEY_HEIGHT
|
|| Tag.KEY_HEIGHT.equals(key)
|
||||||
|| key == Tag.KEY_MIN_HEIGHT
|
|| Tag.KEY_MIN_HEIGHT.equals(key)
|
||||||
|| key == Tag.KEY_HOUSE_NUMBER
|
|| Tag.KEY_HOUSE_NUMBER.equals(key)
|
||||||
|| key == Tag.KEY_REF
|
|| Tag.KEY_REF.equals(key)
|
||||||
|| key == Tag.KEY_ELE)
|
|| Tag.KEY_ELE.equals(key))
|
||||||
tag = new Tag(key, val, false);
|
tag = new Tag(key, val, false);
|
||||||
else
|
else
|
||||||
tag = new Tag(key, val, false, true);
|
tag = new Tag(key, val, false, true);
|
||||||
|
|||||||
29
vtm/src/org/oscim/utils/Utils.java
Normal file
29
vtm/src/org/oscim/utils/Utils.java
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2016 devemux86
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the
|
||||||
|
* terms of the GNU Lesser General Public License as published by the Free Software
|
||||||
|
* Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License along with
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.oscim.utils;
|
||||||
|
|
||||||
|
public final class Utils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Null safe equals.
|
||||||
|
*/
|
||||||
|
public static boolean equals(Object o1, Object o2) {
|
||||||
|
return (o1 == o2) || (o1 != null && o1.equals(o2));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Utils() {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user